Ludzie - czy ktoś może wyjaśnić ten stos? Zauważ, że mój kod nigdzie się nie znajduje. Jeśli korzystasz z Google'a w przypadku któregokolwiek z tych wyjątków, każdy, kto napotkał ten problem, próbował utworzyć okna dialogowe po zakończeniu działania, co nie ma miejsca w tym przypadku. To tylko proste wznowienie działania. Dostrzegam ten wyjątek zgłaszany przez klientów w tej dziedzinie dość często i chciałbym go poprawić, jeśli to możliwe.
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)
Aktualizacja:
Oto, w jaki sposób mogę zdalnie odzyskać ten stos. Najpierw dodaję uncaughtExceptionHandler na początku mojej działalności w onCreate:
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());
}
W mojej klasie RemoteUploadExceptionHandler mam następujący kod:
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();
}
}
To jest kod, który przesyła mi wiele stosów na godzinę, jak ten, który pokazałem powyżej.
Co więcej, jeśli spojrzysz na kod ActivityThread przez wyszukiwanie kodu Google możesz zobaczyć tę kontrolę przed wywołaniem addView:
if (r.window == null && !a.mFinished && willBeVisible) {
Tak więc działanie nie zostało zakończone i jako takie powinno nadal być prawidłowe.
Ponadto numery linii nie pasują do tego, co widać w kodzie źródłowym Google. Sprawdzić plik ActivityThread.java w źródle 2.3.3. Linia 2268 znajduje się w prywatnej metodzie createThumbnailBitmap. Wersja kompilacji przesłana przez klienta powodującego awarię to 10, co oznacza, że SDK_INT wynosi 10, a więc 2.3.3.