2016-03-23 3 views
0

У меня есть класс, который расширяет AsyncTaskAndroid AsyncTask получить результат после finsih выполнения

public class MyClass extends AsyncTask<Void, Void, Void> { 
    private String response; 

    public String getResponse(){ 
     return response; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     /* code */ 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     response = aString; 
     super.onPostExecute(result); 
    } 
} 

В другой деятельности, я создаю экземпляр MyClass

MyClass c = new MyClass(); 
c.execute(); 
response = c.getResponse(); 
Toast.makeText(getApplicationContext(), "response = " + response, Toast.LENGTH_LONG).show(); 

Однако я получил нуль на переменном отклик, возможно, потому, что Toast был выполнен до завершения задачи. Не могли бы вы дать мне правильный путь, чтобы я смог получить результат после завершения задачи?

+0

Зова Тост из AsyncTask. – Wukash

+0

Можете ли вы опубликовать thelogcat? – Raghavendra

+0

Мне нужно получить результат по активности, создающей экземпляр – ZZZ

ответ

2

Вам не нужно поле класса для результата. AsyncTask<Params, Progress, Result> доставит все, что вам нужно.

Итак, вы хотите вернуть String из Задачи. Для этого вам необходимо изменить Result на String. В принципе, как это:

public class MyClass extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... arg0) { 
     /* do background stuff to get the String */ 
     return string; // the one you got from somewhere 
    } 
} 

Вы также должны ждать вычисления с помощью вызова метода get().

String response = new MyClass().execute().get(); 
Toast.makeText(getApplicationContext(), "response = " + response, Toast.LENGTH_LONG).show(); 

Подробнее о AsyncTask#get here

+0

Я не думаю, что это работает. Метод 'doInBackground' работает в фоновом потоке, но« get() »запускается в потоке пользовательского интерфейса, поэтому оба процесса работают параллельно, и это не гарантирует, что мы можем« получить »правильную строку, возвращаемую из процессов в фоновом режиме –

1

AsyncTask выполняет асинхронно, в отдельной теме. Это означает, что при вызове response = c.getResponse(); задача все еще занята. Вы можете обрабатывать результат в onPostExecute или использовать BroadcastReceiver или EventBus, чтобы уведомить вашу деятельность о завершении задачи.

0

сделать один конструктор в MyClass с контекстом деятельности в качестве аргумента, как ниже

Context context; 

public MyClass(Context context){ 
    this.context = context; 
} 

// make toast in onPostExecute 
@Override 
protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     Toast.makeText(context, "response = " + result, Toast.LENGTH_LONG).show(); 
} 

в другом активности вызова AsyncTask как ниже

MyClass c = new MyClass(YourActivity.this); 
c.execute(); 
Смежные вопросы