Android

Return a value from AsyncTask in Android [duplicate]

Возвращает значение из AsyncTask в Android

Один простой вопрос: возможно ли вернуть значение в AsyncTask?

//AsyncTask is a member class
private class MyTask extends AsyncTask<Void, Void, Void>{

protected Void doInBackground(Void... params) {
//do stuff
return null;
}

@Override
protected void onPostExecute(Void result) {
//do stuff
//how to return a value to the calling method?
}
}

А затем в моем Activity/Fragment:

// The task is started from activity
myTask.execute()
// something like this?
myvalue = myTask.getvalue()

Редактировать:
Об этом спрашивали давным-давно, когда я не был знаком с Java, теперь, когда я лучше с этим разбираюсь, я сделаю краткое резюме:

Смысл асинхронной задачи в том, что задача является asynchronous, что означает, что после вызова execute() задачи задача начинает выполняться в собственном потоке. возвращать значение из asynctask было бы бессмысленно, потому что исходный вызывающий поток уже продолжил выполнять другие действия (таким образом, задача асинхронна).

Подумайте о времени: в какой-то момент времени вы запустили задачу, которая будет выполняться параллельно с основным потоком. Когда параллельно выполняемая задача завершена, время также истекло в основном потоке. Параллельная задача не может вернуться назад во времени, чтобы вернуть значение в основной поток.

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

Переведено автоматически
Ответ 1

Для этого и существует onPostExecute(). Он выполняется в потоке пользовательского интерфейса, и вы можете вывести свой результат оттуда на экран (или куда угодно еще, что вам нужно). Он не будет вызван, пока не будет доступен конечный результат. Если вы хотите получить промежуточные результаты, взгляните на onProgressUpdate()

Ответ 2

Почему бы не вызвать метод, который обрабатывает значение?

public class MyClass extends Activity {

private class myTask extends AsyncTask<Void, Void, Void> {

//initiate vars
public myTask() {
super();
//my params here
}

protected Void doInBackground(Void... params) {
//do stuff
return null;
}

@Override
protected void onPostExecute(Void result) {
//do stuff
myMethod(myValue);
}
}

private myHandledValueType myMethod(Value myValue) {
//handle value
return myHandledValueType;
}
}
Ответ 3

Самый простой способ - передать вызывающий объект в асинхронную задачу (после ее создания, если хотите):

public class AsyncGetUserImagesTask extends AsyncTask<Void, Void, Void> {

private MyImagesPagerFragment mimagesPagerFragment;
private ArrayList<ImageData> mImages = new ArrayList<ImageData>();

public AsyncGetUserImagesTask(MyImagesPagerFragment imagesPagerFragment) {
this.mimagesPagerFragment = imagesPagerFragment;
}

@Override
public Void doInBackground(Void... records) {
// do work here
return null;
}

@Override
protected void onPostExecute(Void result) {
mimagesPagerFragment.updateAdapter(mImages);
}
}

И в вызывающем классе (вашей активности или фрагменте) выполняет задачу:

public class MyImagesPagerFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
AsyncGetUserImagesTask mGetImagesTask = new AsyncGetUserImagesTask(this);
mGetImagesTask.execute();
}

И затем onPostExecuteMethod вызовет любой метод в вашем исходном классе, который вам нравится, например:

    public void updateAdapter(List<ImageData> images) {
mImageAdapter.setImages(images);
mImageAdapter.notifyDataSetChanged();
}
}
Ответ 4

Пример кода: Activity использует AsyncTask для получения значения в фоновом потоке, затем AsyncTask возвращает результат обратно в Activity, вызывая processValue:

public class MyClass extends Activity {
private void getValue() {
new MyTask().execute();
}

void processValue(Value myValue) {
//handle value
//Update GUI, show toast, etc..
}

private class MyTask extends AsyncTask<Void, Void, Value> {
@Override
protected Value doInBackground(Void... params) {
//do stuff and return the value you want
return Value;
}

@Override
protected void onPostExecute(Value result) {
// Call activity method with results
processValue(result);
}
}
}
2023-05-21 21:40 java android android-asynctask