AsyncTask运行两个不同的线程?

时间:2012-03-17 05:57:55

标签: android android-asynctask

我想知道是否有可能(最佳实践)使用AsyncTask在两个不同的线程中运行两个长时间运行的查询?

我的情况是这样的:

1) Loading data from HttpGet (once it load then load into the listview)
2) Parsing the data into Listview

目前,我正在运行doInBackground来执行#1并在onPostExecute上运行#2 反应还可以,但我在想是否有办法让它更快?

如果我选择运行两个不同的线程,但问题是,我是否可以从onPostExecute运行另一个线程(AsyncTask)?

谢谢,

3 个答案:

答案 0 :(得分:0)

我不确定它是否会更快,因为如果你考虑它的步骤有点串行,你首先需要数据检索,然后解析然后在listview中显示数据。

所以AsyncTask只会帮助你避免ANR。你总是可以在另一个AsyncTask中进行解析。但它不会使整个周期更快。

答案 1 :(得分:0)

我很困惑为什么你需要创建一个单独的线程。

doinBackground(Process)是一个与postExecute线程(UI)不同的线程。因此,当您执行第1步时,它将自动处于步骤2的单独线程中。

我希望这会有所帮助。如果你只是想知道如何运行两个线程只是评论,我可以解释一下。

但是对于你的情况,asynctask基本上已经为你完成了:D

尝试扩展此类并将线程放在其中。值得一试。

import android.os.AsyncTask;

public class ThreadWorker extends AsyncTask<Void, Void, Boolean> {

ThreadWorker.Method CURRENT_METHOD;

enum Method{
    PREEXCEUTE,
    BACKGROUND,
    POSTEXECUTE,
    PROGRESSUPDATE,     
}
@Override
protected void onPreExecute() {  
    try{
        CURRENT_METHOD = Method.PREEXCEUTE;
        preExecute();
    }catch(Exception e){
        onError(Method.PREEXCEUTE);
    }
}
@Override
protected Boolean doInBackground(Void... params) {
    try{
        CURRENT_METHOD = Method.BACKGROUND;
        background();
    }catch(Exception e){
        onError(Method.BACKGROUND);
    }
    return true;
}
@Override
protected void onProgressUpdate(Void... v){
    try {
        CURRENT_METHOD = Method.PROGRESSUPDATE;
        onProgressUpdate();
    } catch (Exception e) {
        onError(Method.PROGRESSUPDATE);
    }       
}
protected void onPostExecute(Boolean result) { 
    try{
        CURRENT_METHOD = Method.POSTEXECUTE;
        postExecute();
    }catch(Exception e){
        onError(Method.POSTEXECUTE);
    }
} 
public ThreadWorker.Method getCurrentThread(){
    return CURRENT_METHOD;
}
public void preExecute() throws Exception{};
public void background() throws Exception{};
public void postExecute() throws Exception{};
public void onProgressUpdate() throws Exception{};
public void onError(Method m){};
   }

我在这堂课中成功地做到了

答案 2 :(得分:0)

当您启动AsyncTask时,您的应用程序中会运行两个线程。 UI线程和AsyncTask线程。

在一个AsyncTask中执行长时间运行的操作。获取/解析数据应该在doInBackground中完成。从UI线程调用onPostExceute,这是你应该更新ListView的唯一地方。

您可以从onPostExecute启动另一个AsyncTask,但是在doBackground完成后会调用它。

要并行运行两个任务,请从UI线程同时调用两个AsyncTasks。