如何在一个Activity中运行两个AsyncTasks?

时间:2014-05-28 12:09:27

标签: android android-asynctask

我有两个Activity s(mainActivity& downloadActivity)我在AsyncTask

中有downloadActivity

downloadActivity首先执行getFileAsyncTask以阅读JSON文件以添加一些图片并从图片中创建ListView,如果用户点击图片,downloadAsyncTask被叫,它开始从互联网上下载东西。 我的问题在于:当第二个AsyncTask正在运行时,我会回到mainActivity并再次回到downloadActivity,直到AsyncTask才会调用第一个downloadAsyncTask完成了

public class downloadActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        new getFileAsyncTask().execute();
        ...
    }
    private class getFileAsyncTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
        //fetch a json file from internet and add images in ListView
            return null;
    }
    //there is an BaseAdabter class 
    //if user clicks on an image it calls this downloadAsyncTask.execute()
    private class downloadAsyncTask extends AsyncTask<Void, Integer, Void> {
        @Override
        protected void onPreExecute() {
        //download the file
    }

    @Override
    protected Void doInBackground(Void... unused) {
        //download the file
    }
}

注意:我想写一些类似购物应用的内容。例如,用户可以下载文件并浏览商店以查看产品。

4 个答案:

答案 0 :(得分:16)

如果您想并行运行多个AsyncTasks,则可以在任务中调用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)而不是execute()。默认情况下,AsyncTasks以串行方式运行,先到先得。

请注意两个线程不会在相同的数据上进行交互,这可能会导致一些奇怪且难以跟踪的错误。

答案 1 :(得分:0)

你可以在一个异步类中创建它,它有两个方法首先在doInBackground中获取json文件等待响应...如果可以,则调用下载文件方法。那些方法将返回httpResponse对象

答案 2 :(得分:0)

制作一个类似于:

的classtask

在主线程中全局声明进度条。

现在您需要做的是在主线程中启动一个异步任务,如

 public class myactivityextends Activity {
 private ProgressDialog _dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.base_screen);
            new abc().execute();
 }

     class   abc extends AsyncTask(String,String,String){
         @Override
    protected void onPreExecute() {
        _dialog = new ProgressDialog(_ctx);
        _dialog.setCancelable(false);
        _dialog.setMessage("Loading");
        _dialog.show();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
            @Override
    protected void onPostExecute(String result) {
               // in post execute of this class you can run a new thread of your downaloder thread. and in post execute of last thread you have to dismiss the progess bar.
            new download activity.execute();
              }
} 
       }
}
}

答案 3 :(得分:0)

您可以在活动中覆盖onBackPressed功能,并在转到上一个活动之前完成当前活动。再一次,你来下载它,它称之为oncreate方法并首先调用AsynctTask。