AsyncTask работает два разных потока? - PullRequest
0 голосов
/ 17 марта 2012

Мне интересно, возможно ли (лучшая практика) запустить два длительных запроса в двух разных потоках, используя AsyncTask?

Мой сценарий выглядит примерно так:

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

В настоящее время я использую doInBackground для выполнения # 1 и onPostExecute для выполнения # 2 Ответ в порядке, но я думаю, есть ли способ сделать это быстрее?

если я запустлю два разных потока, но вопрос в том, смогу ли я запустить другой поток (AsyncTask) с onPostExecute?

Спасибо

Ответы [ 3 ]

0 голосов
/ 17 марта 2012

Я не совсем понимаю, почему вам нужно создать отдельный поток.

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){};
   }

Я успешно делаю это в этом классе

0 голосов
/ 18 марта 2012

Когда вы запускаете AsyncTask, в вашем приложении работают два потока. Поток пользовательского интерфейса и поток AsyncTask.

Выполнять длительные операции в одной AsyncTask. Получение / синтаксический анализ данных должны выполняться внутри doInBackground. onPostExceute вызывается из потока пользовательского интерфейса, который является единственным местом, из которого вы должны обновлять свой ListView.

Вы можете запустить еще один AsyncTask из onPostExecute, но он будет вызван после завершения doBackground.

Чтобы выполнить две задачи параллельно, вызовите две AsyncTasks одновременно из потока пользовательского интерфейса.

0 голосов
/ 17 марта 2012

Я не уверен, будет ли это быстрее, потому что, если вы подумаете об этом, шаги являются своего рода последовательными, вам сначала нужно получить данные, затем выполнить синтаксический анализ и затем отобразить данные в виде списка.

Таким образом, AsyncTask только поможет вам избежать ANR.Вы всегда можете выполнить анализ в другой AsyncTask.Но это не сделает весь цикл быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...