2013-01-10 123 views
0

我使用活动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(); 
+0

对不起,但是当我需要切换到任何其他活动,而不仅仅是活动B' – Kinorsi

回答

0

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

+0

这解决了我的问题,谢谢你的帮助! – Kinorsi

+0

不客气。很高兴我能帮上忙! :) – codeMagic

0

您可以执行的一个选项是拥有一个BaseActivity,您的所有活动都可以扩展从那里有一个成员变量持有你的前景活动。当您的AsyncTask完成时,您可以使用BaseActivity中的活动引用来显示您的AlertDialog。例如:

文件: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); 
    } 
} 
+0

谢谢你们一样。 – Kinorsi