Android Asynctask按顺序逐个运行

时间:2014-10-29 09:03:24

标签: java android

我正在尝试创建大量的asynctask,并按顺序运行一个。 可能吗?我找不到任何解决方案。

onPostExecute然后再次调用一个新的AsnycTask对我来说不是一个好的解决方案。

这就是我想要的:

async1.execute
async2.execute
async3.execute

async1.over->async2.start
async2.over->async3.start

5 个答案:

答案 0 :(得分:1)

喜欢

async1.execute

then write async2.execute into onPostexecute of async1

and then write async3.execute into onPostexecute of async2

没有任何其他有效方法。您可以考虑实现线程(等待/通知),但这不适用于asyntask。

答案 1 :(得分:1)

如果您使用串行执行程序(API 11及更高版本中的默认值),则会自动执行此操作。如果您需要在API 11之前使用它,则需要执行经典的等待/通知技巧(https://www.science.uva.nl/ict/ossdocs/java/tutorial/java/threads/waitAndNotify.html

答案 2 :(得分:1)

我猜你应该使用Executor whit BlockQueue而不是AsyncTask,并使用Handler发送句柄结果。 BockQueue是一个FIFO数据结构,适合你的风格......

答案 3 :(得分:0)

让第一个AsyncTask为MyAsyncTask1,第二个为MyAsyncTask2。现在你想要的是。

执行活动中的MyAsyncTask1 收到回复 现在成功响应,执行MyAsyncTask2 怎么样按顺序调用它们:

MyAsyncTask1.execute();

MyAsyncTask2.execute();

上述代码的问题可以通过以下事实来理解:在AsyncTask对象上调用execute将创建一个在不同内存空间中运行的新线程,并立即启动下一个AyncTask在它自己的内存空间。但这不是我们想要的。我们希望第一个线程必须完成它的工作,然后第二个线程才会开始工作。如何实现?

答案在于onPostExecute()。这是帮助您摆脱这种情况的方法。在MyAsyncTask1上调用执行然后在第一个doInBackground()之后调用{ {1}}将调用AsyncTask。请检查onPostExecute()如果响应为空,如果收到的响应不等于null,并且是有效响应,则调用执行onPostExecute()(如果指定了相应的参数)。

SEE THIS

你可以在链中做到这一点......

答案 4 :(得分:0)

        // Async Task Class here async1
        class YourAsynClass extends AsyncTask<String, String, String> {


            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                // Shows Progress Bar Dialog and then call doInBackground method
                showDialog(progress_bar_type);
            }


            @Override
            protected String doInBackground(String... PassYourdata) {

             // do your stuff here 
            }


            @Override
            protected void onPostExecute(String IFYouwantPassData) {
                // Dismiss the dialog 
                dismissDialog(progress_bar_type);
                // here async2
                new SecondAsyncTask.execute(Passeddata);
            }
        }

并且在第三个中做同样的