GetApplicationContext в классе AsyncTask?

У меня есть пара частных методов AsyncTask, которые я бы хотел вырвать в публичные внешние классы. В моем приложении у меня есть открытый класс, расширяющий приложение, которое содержит некоторые общие процедуры, к которым я хочу получить доступ из разных частей моего приложения. Однако, когда я выхожу из класса AsyncTask, я больше не могу вызвать getApplicationContext (), чтобы получить ссылку на мою библиотеку приложений (класс не наследует ничего из Activity сейчас). GetBaseContext () также будет иметь проблемы. Должен ли я передавать контекст в AsyncTask, когда он создается и создается оттуда? Не уверен, что это безопасно или нет.

import java.util.ArrayList; import android.os.AsyncTask; public class dlTask extends AsyncTask { long totalbytes = 0; long totalread = 0; ArrayList <String> data; @Override protected void onPreExecute () { AppLib lib = (AppLib) getApplicationContext(); lib.saveStatusText ("Contacting " + lib.getServerAddress () + ":" + lib.getServerPort () + "..."); super.onPreExecute (); } @Override protected Object doInBackground (Object... params) { data = lib.sendCommand (CMD_LIST); return true; } @Override protected void onPostExecute (Object result) { if (data != null) { lib.saveStatusText (data.size () + " files found"); } else { Log.d (TAG, "data is null"); Toast.makeText (getBaseContext(), msg, Toast.LENGTH_SHORT).show (); } super.onPostExecute(result); } } 

Должен ли я передавать контекст в AsyncTask, когда он создается и создается оттуда?

У вас нет выбора, так как вы не сможете получить Context любыми другими способами.

Либо передайте контекст в конструкторе вашей AsyncTask, либо используйте статическую переменную в своем классе Application для доступа к ней (установите sMyInstace = this; ). Однако первое решение предпочтительнее.

Вы должны сделать так. В моем случае это работает:

 public class dlTask extends AsyncTask { private Context context; public dlTask(Context context) { this.context = context; } @Override protected void onPreExecute() { super.onPreExecute(); .......... } @Override protected Object doInBackground (Object... params) { data = lib.sendCommand (CMD_LIST); return true; } @Override protected void onPostExecute (Object result) { if (data != null) { lib.saveStatusText (data.size () + " files found"); } else { Log.d (TAG, "data is null"); Toast.makeText (context, msg, Toast.LENGTH_SHORT).show (); //You can use the CONTEXT like this (passing the context variable like parameter } super.onPostExecute(result); }