AsyncTask 中的 AlertDialog.Builder 会引发异常



我正在尝试在AsyncTask中使用AlertDialog.Builder,这个抛出的异常是如此奇怪,以至于我无法解决它。我想在onPostExecute中打开此警报对话框

问题来了:

11-26 15:27:35.805: E/AndroidRuntime(6286): FATAL EXCEPTION: main
11-26 15:27:35.805: E/AndroidRuntime(6286): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:800)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.app.Dialog.show(Dialog.java:287)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at br.com.mypackage.myapp.act.CadastrarView$2.onPostExecute(CadastrarView.java:190)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at br.com.mypackage.myapp.act.CadastrarView$2.onPostExecute(CadastrarView.java:1)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.os.AsyncTask.finish(AsyncTask.java:631)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.os.Looper.loop(Looper.java:176)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at android.app.ActivityThread.main(ActivityThread.java:5419)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at java.lang.reflect.Method.invokeNative(Native Method)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at java.lang.reflect.Method.invoke(Method.java:525)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
11-26 15:27:35.805: E/AndroidRuntime(6286):     at dalvik.system.NativeStart.main(Native Method)

这是我如何尝试的

new AsyncTask<String, Void, String>() {
    @Override
            protected String doInBackground(String... params) {
        add = new UsuarioDAO().insert(usuario, fotoPerfil);                                 
        return "executed";
    }
    @Override
            protected void onPostExecute(String result) {
        progress.dismiss(); 
        if(add){
            AlertDialog.Builder alert = new AlertDialog.Builder(getApplicationContext());
            alert.setTitle("Title");
            alert.setMessage("Obrigado por se cadastrarn"
                             + "Uma mensagem de confirmação foi enviada para seu emailn");
            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {                           
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            startActivity(new Intent(getApplicationContext(), LoginView.class));
                                        }
                                    });     
            AlertDialog dialog = alert.create();
            dialog.show();
        }else{
            Toast.makeText(CadastrarView.this, "Erro encontrado tentando adicionar conta", Toast.LENGTH_SHORT).show();
        }   
    }
}.execute("");

getApplicationContext()替换为 thisWhateverYourActivityIsCalled.this

仅当您确切知道使用getApplicationContext()的原因时,才使用getApplicationContext()。请参阅 Dave Smith 的这篇博客文章,了解有关不同Context对象角色的更多信息。

最新更新