2012-06-25 51 views
0

我正在使用AsyncTask創建進度對話框,然後開始一個新的活動。 的代碼是: -手柄屏幕方向

package com.android.grad; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.provider.MediaStore; 

public class LoginTask extends AsyncTask<Void, Void, Boolean> { 

    private Activity activity; 
    private ProgressDialog pd; 
    private Uri fileUri; 
    private final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; 

    public LoginTask(Activity activity, Uri fileUri) { 
     this.activity = activity; 
     this.fileUri = fileUri; 
    } 

    @Override 
    protected void onPreExecute() { 
     //fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
     pd = ProgressDialog.show(activity, "Signing in", 
       "Please wait while we are signing you in.."); 
    } 

    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
     pd.dismiss(); 
     pd = null; 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
     activity.startActivityForResult(intent, 
       CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
    } 
} 

而且這個任務開始時,我按使用這個動作偵聽器的按鈕。

private OnClickListener loginOnClick = new OnClickListener() { 
     public void onClick(View v) { 
      new LoginTask(LoginActivity.this, fileUri).execute(); 
     } 
    }; 

和我得到那個錯誤,當方向改變。

06-25 20:41:27.199: E/WindowManager(8867): Activity com.android.grad.LoginActivity has leaked window [email protected] that was originally added here 
06-25 20:41:27.199: E/WindowManager(8867): android.view.WindowLeaked: Activity com.android.grad.LoginActivity has leaked window [email protected] that was originally added here 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344) 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267) 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
06-25 20:41:27.199: E/WindowManager(8867): at android.app.Dialog.show(Dialog.java:278) 
06-25 20:41:27.199: E/WindowManager(8867): at android.app.ProgressDialog.show(ProgressDialog.java:116) 
06-25 20:41:27.199: E/WindowManager(8867): at android.app.ProgressDialog.show(ProgressDialog.java:99) 
06-25 20:41:27.199: E/WindowManager(8867): at android.app.ProgressDialog.show(ProgressDialog.java:94) 
06-25 20:41:27.199: E/WindowManager(8867): at com.android.grad.LoginTask.onPreExecute(LoginTask.java:25) 
06-25 20:41:27.199: E/WindowManager(8867): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561) 
06-25 20:41:27.199: E/WindowManager(8867): at android.os.AsyncTask.execute(AsyncTask.java:511) 
06-25 20:41:27.199: E/WindowManager(8867): at com.android.grad.LoginActivity$1.onClick(LoginActivity.java:36) 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.View.performClick(View.java:3527) 
06-25 20:41:27.199: E/WindowManager(8867): at android.view.View$PerformClick.run(View.java:14234) 
06-25 20:41:27.199: E/WindowManager(8867): at android.os.Handler.handleCallback(Handler.java:605) 
06-25 20:41:27.199: E/WindowManager(8867): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-25 20:41:27.199: E/WindowManager(8867): at android.os.Looper.loop(Looper.java:137) 
06-25 20:41:27.199: E/WindowManager(8867): at android.app.ActivityThread.main(ActivityThread.java:4441) 
06-25 20:41:27.199: E/WindowManager(8867): at java.lang.reflect.Method.invokeNative(Native Method) 
06-25 20:41:27.199: E/WindowManager(8867): at java.lang.reflect.Method.invoke(Method.java:511) 
06-25 20:41:27.199: E/WindowManager(8867): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-25 20:41:27.199: E/WindowManager(8867): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-25 20:41:27.199: E/WindowManager(8867): at dalvik.system.NativeStart.main(Native Method) 
06-25 20:41:27.309: D/dalvikvm(8867): GC_CONCURRENT freed 265K, 4% free 9339K/9671K, paused 6ms+4ms 
06-25 20:41:27.519: D/AndroidRuntime(8867): Shutting down VM 
06-25 20:41:27.519: W/dalvikvm(8867): threadid=1: thread exiting with uncaught exception (group=0x2b542210) 
06-25 20:41:27.529: E/AndroidRuntime(8867): FATAL EXCEPTION: main 
06-25 20:41:27.529: E/AndroidRuntime(8867): java.lang.IllegalArgumentException: View not attached to window manager 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:587) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:324) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:151) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.app.Dialog.dismissDialog(Dialog.java:321) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.app.Dialog$1.run(Dialog.java:119) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.os.Handler.handleCallback(Handler.java:605) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.os.Looper.loop(Looper.java:137) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at android.app.ActivityThread.main(ActivityThread.java:4441) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-25 20:41:27.529: E/AndroidRuntime(8867):  at dalvik.system.NativeStart.main(Native Method) 

我搜索的網站上,我沒有發現我

@Override 
    protected void onPreExecute() { 
     //fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
     pd = ProgressDialog.show(activity.getApplicationContext(), "Signing in", 
       "Please wait while we are signing you in.."); 
    } 

    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     pd.dismiss(); 
     pd = null; 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
     activity.startActivityForResult(intent, 
       CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
    } 

06-25 21:23:59.709: E/AndroidRuntime(10041): FATAL EXCEPTION: main 
06-25 21:23:59.709: E/AndroidRuntime(10041): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.view.ViewRootImpl.setView(ViewRootImpl.java:517) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.app.Dialog.show(Dialog.java:278) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.app.ProgressDialog.show(ProgressDialog.java:116) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.app.ProgressDialog.show(ProgressDialog.java:99) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.app.ProgressDialog.show(ProgressDialog.java:94) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at com.android.grad.LoginTask.onPreExecute(LoginTask.java:25) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.os.AsyncTask.execute(AsyncTask.java:511) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at com.android.grad.LoginActivity$1.onClick(LoginActivity.java:38) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.view.View.performClick(View.java:3527) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.view.View$PerformClick.run(View.java:14234) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.os.Handler.handleCallback(Handler.java:605) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.os.Looper.loop(Looper.java:137) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at android.app.ActivityThread.main(ActivityThread.java:4441) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at java.lang.reflect.Method.invokeNative(Native Method) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at java.lang.reflect.Method.invoke(Method.java:511) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-25 21:23:59.709: E/AndroidRuntime(10041): at dalvik.system.NativeStart.main(Native Method) 

回答

1

在旋轉工作的解決方案,該活動被破壞,所以是你的ProgressDialog,因此,當你嘗試要隱藏對話框,它不再存在,並生成此異常。

+0

好的,我該如何處理這個異常? 如何保存對話框的狀態以及方向的改變? –

+0

在您的活動中,您將要覆蓋onSaveInstanceState/onRestoreInstanceState。有可能,你會想保留一個對AsyncTask的引用,並通過Bundle提取相關狀態來保存/恢復 – theelfismike

+0

我會試試:) –

1
com.android.grad.LoginActivity has leaked window [email protected] that was originally added here 

1- 作爲看起來您使用的活動參考顯示對話框只所以代替使活動CTO構造pass Application context到它顯示對話框....

2- pd.dismiss() ; PD = NULL;應在onPostExecute在doInBackground與支票像isShowing或更好的任何一個..........

If(null!=pd && pd.isShowing()){ 
     pd.dismiss(); 

     pd = null; 
    } 
+0

你認爲這會導致我的錯誤嗎? –

+0

的原因之一....看起來更多的問題出現在那裏..... –

+0

好吧,我會試試:) –