1.? Activity ca.ct.activity.OBaccaratActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42db0500 that was originally added here? ? ? ? ? ? ? ? ? ~~~ 出現錯誤的情景是:當我點擊返回鍵,退出一個activity進入另一個activity的時候,有一個dialog,或者是其他的組件在提示,但是這個時候我著急又很快的按了一下返回鍵就報這樣的錯誤? ? ? ? ? ~~~ 解決方法:在dialog中添加一下代碼? ? [java] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? public void onDestroy(){? ? ? ? ? ? ? super.onDestroy();? ? ? ? ? ? ? if(dialog !=null){? ? ? ? ? ? ? ? ? dialog.dismiss();? ? ? ? ? ? ? ? ? dialog =null;? ? ? ? ? ? ? }? ? ? ? ? }? ? ? 2.Fatal signal 11 (SIGSEGV) at 0x00000040 (code=1), thread 20476 (.example.new)? ? ? ? ? ? ~~~出現錯誤的情景:同樣的,某個頁面有視頻播放器,調用surface,和jni,當我點擊返回鍵,然后在很快的點擊一下以后,會報上面的東西,但是并沒有java的異常或者其他提示信息出現? ? ? ? ? ? ~~~解決方法:目前并沒有找到解決的辦法。也不知道什么原因。但是有一篇博客寫的和我的qi類似,但是照著他的方法并沒有解決我的問題。http://blog.csdn.net/sonikk/article/details/9217181? ? 3.android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.? ? ? ? ~~~在非主線程中直接設置組件會拋出這樣的異常。比如我為了簡單在線程中為TextView.setText().這個在低版本中是可以運行。高版本中操作頁面的必須在主線程中。這里只能用handler? ? 4,ava.lang.IllegalStateException: Could not execute method of the activity? ? ? ? ? ? Caused by: java.lang.reflect.InvocationTargetException? ? ? ? ? ? Caused by: java.lang.NullPointerException? ? ? ? ? ? 說白了就是無法執行和activity相關的方法,為什么無法執行呢,因為你給系統的是空引用,出現空指針錯誤? ? ? ? ? ? 造成這種因素的原因很多,我目前已知的,就是代碼的順序問題,在onCreate方法中。? ? 5.has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here? ? ? ? ? ~~~出現錯誤的情景:? ? 經常在應用中需要處理一些耗時的工作,諸如讀取大文件、訪問網絡資源等。為了避免因程序假死而帶來的糟糕用戶體驗,通常我們可以通過線程+Handler或者Android提供的AsyncTask來解決該問題,并一般以ProgressDialog等提示性控件來告知用戶當前的程序進度。而標題中描述的異常則會常常出現在這樣的場景中,并且往往掩蓋了導致異常的真正的罪魁禍首。? ? ? ? ? ~~~問題原因:? ? 從異常描述中,大致的意思是存在窗口句柄泄露,即未能及時銷毀某個PhoneWindow。而這往往誤導了我們,把過多的精力放在查找所謂的內存泄露上了。其實存在這么一種情況,即因我們在非主線程中的某些操作不當而產生了一個嚴重的異常,從而強制當前Activity被關閉。而在關閉的同時,卻沒能及時的調用dismiss來解除對ProgressDialog等的引用,從而系統拋出了標題中的錯誤,而掩蓋了真正導致這個錯誤的異常信息。? ? ? ? ? ~~~解決方法之一:? ? 本解決方法并不能真正的解決問題,但是在一定程度上可以將真正導致錯誤的異常信息顯露出來。即重寫Activity的onDestroy方法,在方法中調用dismiss來解除對ProgressDialog等的引用。? ? 6.遇到過兩次,在RelativeLayout中當我將兩個組件調換位置一個在上一個在下時,在activity中實例化這個組件就會報類型轉換異常,目前沒找到問題原因。? ? 7.Unable to start activity ComponentInfo{com.example.new855/ca.ct.activity.FanTanActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class? ? ? ? Caused by: java.lang.OutOfMemoryError:? ? ? ? ? ? ? ? 理由以及原因:At runtime, Android resize's images based on need (based on the screen size and resolution). It uses Bitmap's for doing the resizing internally. Which, obviously, is very memory intensive (kinda allocates memory like crazy). One quick way to fix such issues can be, that you copy all drawable files to drawable-ldpi, mdpi, hdpi folders. This way android will just pick up the files from these folders and not resize them.? ? 簡單點內存泄漏,這個是一大篇幅的內容,需要慢慢去研究。? ? 8.IllegalArgumentException: View not attached to window manager? ? 引起的原因:A應用在使用Intent顯示啟動其他應用,當關閉其他應用顯A應用界面時報錯。? ? 解決方法1:? ? A應用使用startActivityForResult(intent)啟動其他應用? ? 解決方法2:? ? 關閉其他應用時每次都使用Intent重新拉起一遍A應用? ? 在A中啟動B,B中有線程操作,結束時涉及到對話框的dismiss。如果在操作尚未結束時,按下HOME鍵,線程后臺操作。此時重新進去A,等到線程操作完成就會出現這個異常。此時應該做一個判斷,如下:? ? [java] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? // Dismiss the Dialog only when the parent Activity is still alive.? ? ? ? ? if (SelectContactsActivity!=null&&!SelectContactsActivity.this.isFinishing()) {? ? ? ? ? ? ? ? mProgressDialog.dismiss();? ? ? ? ? }? ? ? 9.IllegalArgumentException: connection is null? ? ? 有時候同樣的代碼,在一個機子上可以正常執行,在另一個機子上就會報這也的異常。這是因為綁定服務的時候bindService(intent, null, BIND_AUTO_CREATE);這也寫的,但是高版本中ServiceConnection不能為空。所以要new一個出來。應該這也寫? ? [java] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? bindService(intent, new ServiceConnection() {? ? ? ? ? ? ? @Override? ? ? ? ? ? ? public void onServiceDisconnected(ComponentName name) {? ? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? }? ? ? ? ? ? ? @Override? ? ? ? ? ? ? public void onServiceConnected(ComponentName name, IBinder service) {? ? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? }? ? ? ? ? }, BIND_AUTO_CREATE);? ? ? ? 10、 你后臺的Activity被系統回收怎么辦:onSaveInstanceState? ? 當你的程序中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B 這個時候A會執行? ? Java代碼? ? [java] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? ? public void onSaveInstanceState(Bundle outState) {? ? ? ? ? ? ? super.onSaveInstanceState(outState);? ? ? ? ? ? ? outState.putLong("id", 1234567890);? ? ? ? ? ? }? ? ? ? ? public void onSaveInstanceState(Bundle outState) {? ? ? ? ? ? ? ? ? super.onSaveInstanceState(outState);? ? ? ? ? ? ? ? ? outState.putLong("id", 1234567890);? ? ? ? ? }? ? ? B 完成以后又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回 收的A就要重新調用onCreate()方法,不同于直接啟動的是這回onCreate()里是帶上參數savedInstanceState,沒被收回的就還是onResume就好了。? ? savedInstanceState是一個Bundle對象,你基本上可以把他理解為系統幫你維護的一個Map對象。在onCreate()里你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。? ? 11. 如何將SQLite數據庫(dictionary.db文件)與apk文件一起發布?? ? ? ? 解答:可以將dictionary.db文件復制到Eclipse Android工程中的resaw目錄中。所有在resaw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件復制到resaw目錄中? ? 12.Gradle DSL method not found: 'runProguard()'? ? 要讓sync成功,改下gradle的版本就可以了,如下:? ? dependencies {? ? ? ? ? ? classpath 'com.android.tools.build:gradle:0.14.1'? ? ? ? ? ? // NOTE: Do not place your application dependencies here; they belong? ? ? ? ? ? // in the individual module build.gradle files? ? ? ? }? ? 但是真正的解決辦法是將一下內容更換就可以? ? [html] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? buildTypes {? ? ? ? ? ? ? release {? ? ? ? ? ? ? ? ? runProguard false // 已經被廢棄并且停止使用了? ? ? ? ? ? ? ? ? ......? ? ? ? ? ? ? }? ? ? ? ? }? ? ? new:? ? [html] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? buildTypes {? ? ? ? ? ? ? release {? ? ? ? ? ? ? ? ? minifyEnabled false // 替代的方式? ? ? ? ? ? ? ? ? ......? ? ? ? ? ? ? }? ? ? ? ? }? ? ? 13:Gradle version 2.10 is required. Current version is 2.8 Error? ? https://services.gradle.org/distributions/gradle-2.10-all.zip? 從該鏈接下載文件? ? Settings > Builds,Execution,Deployment > Build Tools > Gradle >Gradle home path。 修改2.8的目錄改為2.10? ? 14:cannot perform this action after onsaveinstancestate。? ? 百度了一下,都說將commit替換成commitAllowingStateLoss就可以了。(我的問題在于在onResume()方法內使用fragment的commit)這樣替換的確解決了問題,但是后來仔細研究了下才發現事情沒這么簡單。? ? 拋出異常的原因? ? 眾所周知,Android系統可以為了釋放資源在任意時刻終止進程,有些后臺運行的進程可能都不會有任何提示的被殺。而onSaveInstanceState()就是給activity一個最后機會去保存它需要保存的東西,bundle對象就是所要保存信息的載體被傳到系統服務進程,如果有朝一日該activity被重新創建時,該對象就會被傳回幫助activity重現先前的狀態。那么拋出異常的原因在哪兒呢?事實上bundle對象僅僅是activity在調用onSaveInstanceState()時的快照,也就意味著在onSaveInstanceState()后使用FragmentTransaction#commit()時,bundle并沒有對該transaction作保存而在activity還未恢復到最初狀態時調用,這樣便會出現UI的丟失,為了保護用戶體驗IllegalStateException就被拋出了。? ? 版本差異? ? 如何避免? ? 1 在activity生命周期方法內使用FragmentTransaction#commit()應謹慎? ? ? 多數的應用會在onCreate()中使用該方法,所以不會遇到這樣的問題,但如果在onActivityResult(), onStart()或onResume()中使用時就有可能遇到了。那么如果因為一些原因一定要在這些方法中使用FragmentTransaction#commit()該怎么辦呢(比如說從下一個頁面回來時需要刷新界面的時候)。這時最好在FragmentActivity#onResumeFragments()或者Activity#onPostResume()中使用。這兩個方法會保證在activity恢復到最初狀態后被調用。? ? 2 commitAllowingStateLoss()只能當做最后的手段? ? ? ? commit和commitAllowingStateLoss()之間的唯一區別是如果狀態丟失后者僅僅是不拋出異常而已。一般情況下你不會想用這個方法因為它仍然會有狀態丟失的可能。? ? 由于在百度上看到多數的解決辦法是使用commitAllowingStateLoss(),并非說這個辦法不行,而是盡量精益求精,找到問題的本質所在。翻譯有出入 ,請盡量看原文。? ? 詳細的信息請參考原作者文章:http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html? ? 15:Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.MainActivity}: java.lang.IllegalStateException: This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat.? ? 產生的原因是:com.android.support:appcompat-v7與rasterized vectors不兼容,gradle2.0及其之上,library的資源沒有柵格化,所以不會發生這個問題? ? 2. 解決方案:? ? 1.在projectgradle中將gradle版本改為2.0或者之上? ? 2. 再次運行,此時控制臺輸出異常:? ? [html] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? Warning:Gradle version 2.10 is required. Current version is 2.8. If using the gradle wrapper, try editing the distributionUrl in xxx\bbb\gradle-wrapper.properties to gradle-2.10-all.zip? ? ? 按照路徑所指出的地址,找到文件gradle-wrapper.properties,編輯最后一句版本號為日志中所輸出的版本? ? [html] view plain copy? ? 在CODE上查看代碼片派生到我的代碼片? ? ? ? distributionBase=GRADLE_USER_HOME? ? ? ? ? distributionPath=wrapper/dists? ? ? ? ? zipStoreBase=GRADLE_USER_HOME? ? ? ? ? zipStorePath=wrapper/dists? ? ? ? ? distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip? ? ? 3. 再次運行,還是錯誤,原因是你還沒有下載gradle-2.10? ? 這時可以從網上下載一個gradle-2.10.zip并解壓,然后放到AndroidStudiodd的默認gradle配置目錄
無標題文章
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...