2013-01-10 120 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