2012-02-25 9 views

回答

13

使用On选择是使用监听器,在那里你创建一个接口,你的活动implents,是这样的:

public interface AsyncListener { 
    public void doStuff(MyObject obj); 
} 

这样,如果您继承AsyncTask,则很容易添加此侦听器,然后在onPostExecute()中,您可以执行类似操作:

protected void onPostExecute(MyObject obj) { 
    asyncListener.doStuff(obj); 
} 
6

这取决于您的类结构,但是如果您的AsyncTask是您的活动中的类,那么您可以引用该活动的方法。 你会怎么做是你onPostExecute方法调用传递被中的AsyncTask检索到活动中,你可以使用它的一些数据的活动的功能..

的代码看起来像这样

class YourActivity extends Activity { 
    private static final int DIALOG_LOADING = 1; 

    public void onCreate(Bundle savedState) { 
    setContentView(R.layout.yourlayout); 
    showDialog(DIALOG_LOADING);  
    new LongRunningTask1().execute(1,2,3); 

    } 

    protected Dialog onCreateDialog(int dialogId) { 
    switch(dialogId) { 
     case DIALOG_LOADING: 
      ProgressDialog pDialog = new ProgressDialog(this); 
      pDialog.setTitle("Loading Data"); 
      pDialog.setMessage("Loading Data, please wait..."); 
      return pDialog; 
     default: 
      return super.onCreateDialog(dialogId); 
     }  
    } 

    private void onBackgroundTaskDataObtained(List<String> results) { 
     dismissDialog(DIALOG_LOADING); 
    //do stuff with the results here.. 
    } 

    private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> { 
     @Override 
     protected void onPreExecute() { 
      //do pre execute stuff 
     } 

     @Override 
     protected List<String> doInBackground(Long... params) { 
      List<String> myData = new ArrayList<String>(); 
      for (int i = 0; i < params.length; i++) { 
       try { 
        Thread.sleep(params[i] * 1000); 
        myData.add("Some Data" + i); 
       } catch(InterruptedException ex) { 
       }     
      } 
      return myData; 
     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      YourActivity.this.onBackgroundTaskDataObtained(result); 
     }  
    } 

} 

所以典型的流程就是这样,设置当前页面的视图,然后显示进度对话框。在那之后开始异步任务(或者任何时候,实际上并不重要)。

异步任务完成后,调用该活动的函数并将其传递给数据。 不要在异步任务中使用共享数据,否则可能会导致线程问题。相反,一旦完成后,将其传递给活动。如果你想更新视图逐步而做的工作,你可以在onProgressUpdate

+0

谢谢您的回答。我不是AsyncTask被用作子类的粉丝。我想你应该能够使用事件。我认为答案是使用意图,但我只会创建一个我不想要的活动的新实例。 – skinnybrit51 2012-02-25 20:45:57

+0

您可以轻松地在自己的类中使用AsyncTask,但只有在您使用来自多个不同活动的相同逻辑时才有用。在这种情况下,您可以:1.使用公共基类(不是活动,而是扩展活动),然后你会有一个可以从异步任务中调用的通用方法。或者更好的是,让他们都实现一个通用接口,它具有我所描述的回调。将对活动的引用传递给AsyncTask的构造函数,并确保asyncTask具有构造函数,该构造函数接受接口类型的参数。 – 2012-02-25 20:49:37

+0

你最后的选择是完全抛弃AsyncTask,并把它放到一个你需要创建一个新线程来执行后台活动的服务中(因为默认情况下服务不会在自己的线程中运行)。一个简单的方法是创建一个IntentService,为您创建一个新的线程。 – 2012-02-25 20:51:45

相关问题