Как один интерфейс можно использовать для более чем двух фоновых задач Android в рамках одного действия? - PullRequest
2 голосов
/ 22 марта 2019

У меня есть класс активности, который дважды вызывает фоновый AsyncTask, например

BackgroundTask bt1 = new BackgroundTask(this, ApiHelper.GET);
bt.execute(url1);

BackgroundTask bt2 = new BackgroundTask(this, ApiHelper.POST, params);
bt.execute(url2);

, один используется для получения данных, а другой - для отправки данных на сервер.

Конструкторыэтот AsyncTask выглядит следующим образом

public BackgroundTask(Context context, String method) {
    this.context = context;
    this.method = method;
    this.callback = (onBackgroundTaskListener<String>) context;
}

public BackgroundTask(Context context, String method, ArrayList<NameValuePair> params) {
    this.context = context;
    this.method = method;
    this.callback = (onBackgroundTaskListener<String>) context;
    this.params = params;
}

Теперь MainActivity.class реализован с помощью интерфейса onBackgroundTaskListener<String> как

public interface onBackgroundTaskListener<T> {
    void onTaskComplete(T result);
}

onPostExecute класса AsyncTask, String result возвращается или передается обратновызывающий класс, показанный ниже.

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    callback.onTaskComplete(result);
}

Теперь у меня есть один метод (onTaskComplete) в MainActivity для решения двух ответов, поступающих от одной фоновой задачи.Я хотел бы использовать условие, чтобы выяснить, какое выполнение возвращает результат, подобный ...

@Override
public void onTaskComplete(String result) {
    if (execution == 1) { 
        // Parse the GET result
    } else if(execution == 2) { 
        // Parse the POST result
    }
}

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

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я бы порекомендовал вам создать новый класс и использовать этот класс вместо String при создании AsyncTask и передаче результата обратно из AsyncTask

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

Например:

// Create a new class to hold the result of `AsyncTask` execution
public class TaskExecutionResult {
    public String method;
    public String resultString;
}

// When subclassing AsyncType assign TaskExecutionResult as return type
// Please replace URL with input parameters you require (perhaps a method string)
private class BackgroundTask extends AsyncTask<URL, Integer, TaskExecutionResult> {

    // doInBackground will now return TaskExecutionResult type of object
    protected TaskExecutionResult doInBackground(URL... urls) {
        // Here populate a value which will identify your AsyncTask into return value (perhaps a method string)
        ...
    }

    // onPostExecute will also accept TaskExecutionResult type of object
    protected void onPostExecute(TaskExecutionResult result) {
        super.onPostExecute(result);
        callback.onTaskComplete(result);
    }
}

Затем используйте TaskExecutionResult в onTaskComplete:

public void onTaskComplete(TaskExecutionResult result) {
    if (result.method.equals("GET")) { 
        // Parse the GET result (from result.resultString)
    } else if(result.method.equals("POST")) { 
        // Parse the POST result (from result.resultString)
    }
}

Этот подход также позволит вамлегко обновить объект результата, если вам нужно добавить дополнительные возвращаемые переменные.

0 голосов
/ 22 марта 2019
enum BackgroundType{ GET, POST }

public interface onBackgroundTaskListener<T> {
    void onTaskComplete(T result, BackgroundType type);
}

--------------------------
BackgroundTask bt1 = new BackgroundTask(this, ApiHelper.GET, GET);
bt.execute(url1);

BackgroundTask bt2 = new BackgroundTask(this, ApiHelper.POST, params, POST);
bt.execute(url2);
------------------------
@Override
public void onTaskComplete(String result,  BackgroundType type) {
    switch(type){
      case GET:
         break;
      case POST:
         break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...