我想知道是否有可能(最佳实践)使用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)?
谢谢,
答案 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。