2013-04-16 1 views
0

ProgressDialog를 돌리는 AsyncTasc가 있습니다. 모든 동작이 훌륭하지만 비정상적인 동작이 발생하면 응용 프로그램이 실패합니다. 나는 그 사용자가 절대로 그렇게 행동하지 않을 것이라는 것을 알고있다. 그러나 모든 것을 시도하기 위해서는 좋은 테스트가 필요합니다.비정상적인 동작에서 ProgressDialog 및 AsyncTask가 실패합니다.

코드 :

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 

public class MainActivity extends Activity { 
    ProgressDialog mProgressDialog; 
    GetSubs gs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     mProgressDialog.setOnCancelListener(new OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       Log.d("Called on Cancel", " Listener"); 
       gs.cancel(false); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public void Clicked(View view) { 
     gs = new GetSubs(); 
     gs.execute(); 
    } 

    public class GetSubs extends AsyncTask<Void, Void, String> { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      mProgressDialog.show(); 
      Log.d("onPreExecute", " in AsyncTasc"); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      for (int i = 0; i < 5; i++) { 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if (isCancelled()) break; 
      } 
      return null; 
     } 

     @Override 
     protected void onCancelled() { 
      // TODO Auto-generated method stub 
      super.onCancelled(); 
      Log.d("onCancelled", " in AsyncTasc"); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      mProgressDialog.dismiss(); 
      Log.d("onPostExecute", " in AsyncTasc"); 

     } 

    } 

} 

로그 캣 :

04-16 21:14:21.053: E/AndroidRuntime(28767): FATAL EXCEPTION: main 
04-16 21:14:21.053: E/AndroidRuntime(28767): java.lang.IllegalArgumentException: View not attached to window manager 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:751) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:474) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:163) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.app.Dialog.dismissDialog(Dialog.java:348) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.app.Dialog$1.run(Dialog.java:139) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.app.Dialog.dismiss(Dialog.java:333) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at com.example.getusersubs.MainActivity$GetSubs.onPostExecute(MainActivity.java:82) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at com.example.getusersubs.MainActivity$GetSubs.onPostExecute(MainActivity.java:1) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.os.AsyncTask.finish(AsyncTask.java:602) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.os.Looper.loop(Looper.java:154) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at android.app.ActivityThread.main(ActivityThread.java:4945) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at java.lang.reflect.Method.invoke(Method.java:511) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-16 21:14:21.053: E/AndroidRuntime(28767): at dalvik.system.NativeStart.main(Native Method) 

에 어떤 문제가 있습니까? 답변

주셔서 감사합니다

답변

0

변화 :

 @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     mProgressDialog.dismiss(); 
     Log.d("onPostExecute", " in AsyncTasc"); 

    } 

@Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if(mProgressDialog != null && mProgressDialog.isShowing()){ 
       mProgressDialog.dismiss(); 
     } 
     Log.d("onPostExecute", " in AsyncTasc"); 

    } 

에 문제는 당신이 그것을 보여 주거나하지 않는 경우, 사용자가 취소 할 수 있습니다 확인하지 않고 진행-대화 상자를 닫습니다하려고하는 것입니다 해당 대화 상자를 쉽게 눌러 backKey.

여전히 사용자가 Cancellable을 false로 설정하여 대화 상자를 기다리게 할 수 있습니다. 그런 식으로 백키는 효과가 없습니다.

+0

변경 후에도 여전히 실패하지만'setCancellable()'이 내 문제를 해결했습니다. 설명해 주셔서 감사합니다. – Bullman

관련 문제