Android開発でエラーや解決策のまとめ(他所で見た)

5463 ワード

一、dialog.ショー()によるandroidview.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の時に1つのactivityをウィンドウの担体としなければならなくて、上のログの意味はDialogのactivityを載せてすでに破棄されて、存在しません
解決策
1、ショーの前に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.これはContextのサブクラスを取得します
つまりActivity.これはgetApplicationContext()のサブクラスに相当します
親には子がいる-tokenはいない
子にある親は必ずしもいるとは限らない--token
これには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.Activity NotFoundExceptionエラーは、ブラウザでWebリンクを開く際にブラウザをインストールしていない場合でも同様のエラーが発生し、解決策は同じです
エラーログ
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)

エラーの原因
サブスレッドに1つの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);