1

我正在创建一个应用程序类来在应用程序启动期间执行一些版本检查。下面是我的课。

public class MyApp extends Application {
public MyApp() {
}

@Override
public void onCreate() {
    super.onCreate();    
new checkVersionTask().execute(getApplicationContext) 
}


private class checkVersionTask extends AsyncTask<Context, Integer, Long> {        
    @Override
    protected Long doInBackground(Context... contexts) {
        TODO—version check code
    }
    protected void onPostExecute(Long result) {

            AlertDialog alertDialog;
                alertDialog = new AlertDialog.Builder(MyApp.this).create();
                alertDialog.setMessage(("A new version of app is available. Would you like to upgrade now?"));
                alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, getResources().getString(R.string.Button_Text_Yes), new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int which) {
                         Uri uri = Uri.parse("update URL");
                         Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                         startActivity(intent);
                    }
                });
                alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE,getResources().getString(R.string.Button_Text_No), new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                alertDialog.show(); 

            }
        }
        catch(Exception e){
            Toast.makeText(getApplicationContext(), "ERROR:"+e.toString(),    Toast.LENGTH_LONG).show();
        }
    }
}

}

这里 alertDialog.show 抛出错误

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

据我了解,这是因为上下文不可用。在行

alertDialog = new AlertDialog.Builder(MyApp.this).create();

我尝试了 getApplicationContext() 而不是 MyApp.this,仍然是同样的问题。

谁能建议这里出了什么问题。所有 Toast 语句都工作正常。

4

2 回答 2

4

您不能在应用程序类中创建对话框,因为对话框应该附加到窗口,应用程序不是 UI 类并且没有窗口,因此它不能显示对话框。

您可以通过创建一个将显示对话框的活动来解决它(您可以将数据作为额外的意图传递),并且当数据准备好时触发和意图并显示对话框

于 2013-08-08T22:51:56.863 回答
0

有两个选项可以为您的 AsyncTask 提供正确的上下文:

1) 使用 getBaseContext() 我不肯定这是否可行,它似乎在某些情况下起作用,而不是在其他情况下起作用。

2)如果这不起作用,您需要为您的 checkVersionTask 设置一个构造方法,如下所示。

Context context;  //member variable of the checkVersionTask class

public checkVersionTask(Context c) {
    this.context = c;
}

然后,当您在 onCreate 方法或活动类中的任何位置调用任务时,像这样调用它

new checkVersionTask(MyApp.this).execute();

每当您需要访问 checkVersionTask 中的上下文时,只需说,例如

alertDialog = new AlertDialog.Builder(context).create();
于 2013-08-08T21:22:52.160 回答