皆さん - 誰かこのスタックを説明できますか? 私のコードはどこにもないことに注意してください。これらの例外のいずれかについて Google で検索した場合、この問題を経験したすべての人は、アクティビティが終了した後にダイアログを作成しようとしていましたが、ここではそうではないようです. 簡単な活動履歴書です。現場のクライアントからこの例外が頻繁に報告されているのを目にしており、可能であれば修正したいと考えています。
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405177d8 is not valid; is your activity running?
at android.view.ViewRoot.setView(ViewRoot.java:527)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.view.Window$LocalWindowManager.addView(Window.java:424)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2268)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1721)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2955)
at android.app.ActivityThread.access$1600(ActivityThread.java:124)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3806)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
アップデート:
このスタックをリモートで取得する方法は次のとおりです。まず、アクティビティの onCreate の先頭に uncaughtExceptionHandler を追加します。
try {
File crashLogDirectory = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + Constants.CrashLogDirectory);
crashLogDirectory.mkdirs();
Thread.setDefaultUncaughtExceptionHandler(new RemoteUploadExceptionHandler(this, crashLogDirectory.getCanonicalPath()));
} catch (Exception e) {
if (MyActivity.WARN) Log.e(MyActivity.TAG, "Exception setting up exception handler! " + e.toString());
}
私の RemoteUploadExceptionHandler クラスには、次のコードがあります。
public void uncaughtException(Thread t, Throwable e) {
String timestamp = Calendar.getInstance().getTime().toGMTString();
String filename = timestamp + ".stacktrace";
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
String stacktrace = result.toString();
printWriter.close();
sendToServer(stacktrace, filename);
defaultUEH.uncaughtException(t, e);
}
private void sendToServer(String stacktrace, String filename) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(Constants.RemoteUploadUrl);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("filename", filename));
nvps.add(new BasicNameValuePair("stacktrace", stacktrace));
nvps.add(new BasicNameValuePair("platform_version", platformVersion));
nvps.add(new BasicNameValuePair("device_id", deviceId));
nvps.add(new BasicNameValuePair("build_device", Build.DEVICE));
nvps.add(new BasicNameValuePair("build_brand", Build.BRAND));
nvps.add(new BasicNameValuePair("build_product", Build.PRODUCT));
nvps.add(new BasicNameValuePair("build_manufacturer", Build.MANUFACTURER));
nvps.add(new BasicNameValuePair("build_model", Build.MODEL));
nvps.add(new BasicNameValuePair("build_version", String.format("%d",Build.VERSION.SDK_INT)));
try {
httpPost.setEntity(
new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
httpClient.execute(httpPost);
} catch (IOException e) {
e.printStackTrace();
}
}
これは、上に示したような 1 時間あたり多くのスタックを送信しているコードです。
さらに、 Google コード検索で ActivityThread コードを見ると、addView を呼び出す前にこのチェックを確認できます。
if (r.window == null && !a.mFinished && willBeVisible) {
したがって、アクティビティは終了していないため、まだ有効である必要があります。
さらに、行番号は、Google ソース コードで確認できるものと一致していないようです。2.3.3 ソースの ActivityThread.java ファイルをチェックアウトします。行 2268 は、プライベート メソッド createThumbnailBitmap にあります。クラッシュしたクライアントによってアップロードされたビルド バージョンは 10 です。これは、SDK_INT が 10 であることを示しているため、2.3.3 です。