Как передать контекст AsyncTask? - PullRequest
23 голосов
/ 15 августа 2011

Я хочу предварительно сформировать Toast, когда фоновая задача завершена, просто чтобы пользователь знал, что она завершена.

Я создал новый класс для моей asyncTask, но я не могу использовать getApplicationContext() в этом классе.

Я использую task.execute(getTempFile(this), getApplicationContext()); для запуска задач. getTempFile возвращает объект File, и я пытался передать контекст как объект Context.

В классе My Task есть 3 переменные AsyncTask<Object, Integer, Integer>, поэтому контекст находится во втором объекте. Однако это приводит к сбою приложения.

Редактировать

public class LocationActivity extends Activity implements LocationListener {
    protected void handleImage(Bitmap thumbnail){
        PushDataToServer task = new PushDataToServer();
        task.execute(getTempFile(this), getApplicationContext());
    }
}




public class PushDataToServer extends AsyncTask<Object, Integer, Integer> {

    Context context;

    @Override
    protected Integer doInBackground(Object... params) {
        // TODO Auto-generated method stub
        this.context = (Context) params[1];
        File file = (File) params[0];
        return null;
    }

    protected void onPostExecute(String result) {   
         Toast toast = Toast.makeText(this.context, "All done!", Toast.LENGTH_SHORT);
         toast.show();
    }

}

Ответы [ 4 ]

78 голосов
/ 15 августа 2011

Передайте объект Context в конструктор AsyncTask.

Пример кода:

public class MyTask extends AsyncTask<?, ? ,?> {
    private Context mContext;

    public MyTask(Context context) {
        mContext = context;
    } 
}

, а затем, когда вы создаете AsyncTask:

MyTask task = new MyTask(this);
task.execute(...);
2 голосов
/ 15 августа 2011

Передайте его в конструкторе, а не в качестве параметра метода.Тогда вам не нужно зависеть от общих параметров.

1 голос
/ 12 сентября 2013

Полный пример: Многоразовая AsyncTask

0 голосов
/ 15 августа 2011

Вы говорите, что ваш контекст находится во втором объекте, но ваш второй объект - Integer.Может ли это быть вашей проблемой?Кроме того, еще одно предложение - использовать класс AsyncTask в качестве частного внутреннего класса для своей деятельности. Таким образом, я почти уверен, что у вас будет доступ к getApplicationContext ().

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