Как передать контекст в AsyncTask?
Как передать контекст в классе Async Task
, который закодирован в другом java файле из Main Activity
, но вызван из основного действия?
Ниже мой код:
@Override
protected void onPostExecute(List<Movie_ModelClass> result) {
super.onPostExecute(result);
if (result != null) {
Movie_Adapter movieAdapter = new Movie_Adapter(new MainActivity().getApplicationContext() , R.layout.custom_row, result);
MainActivity ovj_main = new MainActivity();
ovj_main.lv_main.setAdapter(movieAdapter);
} else {
Toast.makeText(new MainActivity().getApplicationContext() ,"No Data Found", Toast.LENGTH_LONG);
}
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
Ответы
Ответ 1
Вы можете просто передать экземпляр Context
в качестве параметра конструктора (и сохранить для него WeakReference
, чтобы избежать утечек памяти).
Например:
public class ExampleAsyncTask extends AsyncTask {
private WeakReference<Context> contextRef;
public ExampleAsyncTask(Context context) {
contextRef = new WeakReference<>(context);
}
@Override
protected Object doInBackground(Object[] params) {
// ...
}
@Override
protected void onPostExecute(Object result) {
Context context = contextRef.get();
if (context != null) {
// do whatever you'd like with context
}
}
}
И выполнение:
new ExampleAsyncTask(aContextInstance).execute();
Ответ 2
Вы можете просто передать контекст в конструкторе вашей AsyncTask.
MyAsyncTask.java
public class MyAsyncTask extends AsyncTask<Void, Integer, List> {
private final Context mContext;
public MyAsyncTask(final Context context) {
mContext = context;
}
}
а затем просто используйте переменную mContext в методе onPostExecute().
Когда вы вызываете свою AsyncTask из своей MainActivity, вы передаете контекст конструктору MyAsyncTask.
MainActivity.java
final MyAsyncTask task = new MyAsyncTask(getApplicationContext());
task.execute();
Ответ 3
Я столкнулся с той же проблемой при попытке сжать изображение с помощью класса Async. У меня был конструктор на месте, поэтому я просто добавил контекст, как показано ниже
public BackgroundImageResize(Context context, Bitmap bm) {
if (bm != null){
mBitmap = bm;
}
this.context =context;
}
Затем я позвонил в класс, как показано ниже,
public void uploadDevicePhoto (Uri imageUri) {
BackgroundImageResize resize = new BackgroundImageResize(this,null);
resize.execute(imageUri);
}