Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 開發中遇到錯誤及解決辦法總結

android 開發中遇到錯誤及解決辦法總結

編輯:關於Android編程

新手總結的開發中所遇到錯誤及解決辦法,如有不對,歡迎指正,如有更好的解決辦法,也請不吝賜教。

一、dialog.show()引起的android.view.WindowManager$BadTokenException錯誤

錯誤日志

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@427b7270 is not valid; is your activity running?
	at android.view.ViewRootImpl.setView(ViewRootImpl.java:653)
	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
	at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
	at android.view.Window$LocalWindowManager.addView(Window.java:558)
	at android.app.Dialog.show(Dialog.java:316)

錯誤原因
錯誤原因是Dialog在show的時候必須要有一個activity作為窗口載體,上面的日志的意思是承載Dialog的activity已經被銷毀了,不存在了

解決辦法
1、在show之前加判斷activity是否被銷毀了
if(!isFinishing()){
dialog.show();
}
2、直接try catch(不推薦)
錯誤日志
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
錯誤原因
先說說上下文的使用
對話框它是我們的Activity的一部分,對話框它掛載在我們的Activity上;
getApplicationContext()這個方法得到的是Context
Activity.this 得到Context的一個子類
也就是說 Activity.this 相當於是getApplicationContext()的子類
父類有的子類一定有 - 沒有 token
子類有的父類不一定有 --有 token
this 還有Activity.this和我們的getApplicationContext();
大多數情況推薦:Activity.this
解決辦法
上下文大多數情況推薦:Activity.this

二、dialog.dismiss()引起的java.lang.IllegalArgumentException錯誤

錯誤日志
java.lang.IllegalArgumentException: View not attached to window manager
	at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:383)
	at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:285)
	at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:104)
	at android.app.Dialog.dismissDialog(Dialog.java:332)
	at android.app.Dialog.dismiss(Dialog.java:315)


錯誤原因
這個錯誤測試是測不出來的,我是加了第三方的錯誤統計才得以發現的,原因是由於某種原因導致Activity被殺死後又重新創建
常發生這類Exception的情形都是,有一個費時的線程操作,需要在顯示一個ProgressDialog,在任務開始的時候顯示一個對話框,然後當任務完成了再Dismiss對話框,如果在此期間如果Activity因為某種原因被殺掉且又重新啟動了,那麼當Dismiss的時候WindowManager檢查發現Dialog所屬的Activity已經不存在了,所以會報IllegalArgumentException: View not attached to window manager.
解決辦法
從網上找了好些解決方案都不是太理想,然後就嘗試著自己解決, 我是這麼解決的,反正加上之後這個錯誤就沒有再出現過,如有不對還請賜教。
重寫Activity的onDestroy,將dialog置為空。
@Override
	public void onDestroy() {
		super.onDestroy();
		dialog=null;
	}



三、讀取通訊錄時,用戶選擇拒絕,未能獲取權限導致的java.lang.SecurityException: Permission Denial錯誤
錯誤日志
java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data/phones from pid=27697, uid=10194 requires android.permission.READ_CONTACTS, or grantUriPermission()
	at android.os.Parcel.readException(Parcel.java:1465)
	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
	at android.content.ContentProviderProxy.query(ContentProviderNative.java:413)
	at android.content.ContentResolver.query(ContentResolver.java:470)
	at android.content.ContentResolver.query(ContentResolver.java:413)


錯誤原因
讀取通訊錄時,用戶選擇拒絕,未能獲取權限
解決辦法
直接try catch 如果捕獲到異常,提示用戶未授於權限。

四、撥打電話時,手機沒有相關應用程序導致的android.content.ActivityNotFoundException錯誤,用浏覽器打開網頁鏈接時,若沒有安裝浏覽器,也會產生類似的錯誤,解決辦法一樣
錯誤日志
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.DIAL dat=tel:xxxxxxxxxxxx }
	at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1632)
	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424)
	at android.app.Activity.startActivityForResult(Activity.java:3438)
	at android.app.Activity.startActivityForResult(Activity.java:3399)


錯誤原因
因為手機沒有安裝可以撥打電話的應用程序
解決辦法
直接try catch 如果捕獲到異常,提示用戶沒有相關的應用程序處理此操作
五、在子線程,更新UI
錯誤日志
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5281)
	at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:943)
	at android.view.View.requestLayout(View.java:15614)
	at android.view.View.requestLayout(View.java:15614)


錯誤原因
在子線程顯示一個Toast,更新UI只能在主線程中進行
解決辦法
1、使用Looper
Looper.prepare();	
	Toast.makeText(aActivity.this,"test",Toast.LENGTH_SHORT).show();
	Looper.loop();


2、使用Handler
在類中定義
private final Handler msgHandler = new Handler(){
        public void handleMessage(Message msg) {
                switch (msg.arg1) {
                case R.string.msg_not_network:
                        Toast.makeText(getApplicationContext(), getResources().getString(R.string.msg_not_network), Toast.LENGTH_SHORT).show();
                        break;
                default:
                        break;
                }
	 }
	};


在子線程中,發送消息
Message msg = msgHandler.obtainMessage();
	msg.arg1 = R.string.msg_not_network;
	msgHandler.sendMessage(msg);

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved