Как передать контекст в 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);

}