活动更改时显示对话框

时间:2013-01-10 03:24:06

标签: android

我使用活动A开始使用AsyncTask进行后台下载,下载完成后,AsyncTask.postExecute会弹出AlertDialog。但是,在下载过程中,我切换到另一个活动B 或任何其他活动。结果是AlertDialog无法显示出来。 AlertDialog使用活动上下文(此处应为A)。那么,我该如何展示AlertDialog

AlertDialog.Builder builder = new  AlertDialog.Builder(context);
builder.setMessage(context.getString(R.string.install));
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
{
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
        //onSure();
    }
});
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener()
{
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
        //onCancle();
    }
});

builder.create().show();

2 个答案:

答案 0 :(得分:0)

如果这是一个长时间运行的任务,在Activity A完成之前无法完成,那么我建议使用IntentService。但这取决于你需要什么。这样做可以让它在后台完成,而不是阻挡UI。可能还有其他选择,但从我所知道的情况看,这听起来最好。除此之外,您可以等待开始下一个活动,并在AsyncTask完成后通过对话框中的按钮启动它,如果这是一个选项

答案 1 :(得分:0)

您可以做的一个选项是拥有一个BaseActivity,您的所有活动都会延伸,其中包含一个保存前台活动的成员变量。 AsyncTask完成后,您可以使用BaseActivity中的Activity引用来显示AlertDialog。例如:

file:MyBaseActivity.java

public class MyBaseActivity extends Activity {

    protected static Activity sForegroundActivity;

    class MyAsyncTask extends AsyncTask<Object, Object, Object> {

        @Override
        protected Object doInBackground(Object... params) {
            // do stuff
            return null;
        }

        protected void onPostExecute(Object result) {

            // cover the edge case where the AsyncTask finished while we are transitioning 
            // between activities and we have not set the foreground activity instance 
            if(sForegroundActivity == null) {
                return;
            }

            AlertDialog.Builder builder = new AlertDialog.Builder(sForegroundActivity);
            builder.setMessage("Showing Dialog in Foreground Activity");
            builder.setPositiveButton(R.string.ok,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // handle ok clicked
                        }
                    });
            builder.setNegativeButton(R.string.cancel,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // handle cancel clicked
                        }
                    });

            builder.create().show();
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        sForegroundActivity = this;
    }

    @Override
    public void onStop() {
        super.onStop();
        sForegroundActivity = null;
    }
}

文件:ActivityA.java

public class ActvityA extends MyBaseActivity {

    private void startAsyncTaskAndGoToActivityB() {

        // start our AsyncTask
        new MyAsyncTask().execute();

        // go to ActivityB.  When the AsyncTask finishes, the AlertDialog will be shown in ActivityB
        Intent myIntent = new Intent(this, ActivityB.class);
        startActivity(myIntent);
    }
}