如何将Context传递给AsyncTask?

时间:2016-05-30 18:35:41

标签: java android

如何在Async Task类中传递上下文,该类在Main Activity的不同java文件中编码但是从主活动调用?

以下是我的代码:

 @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();
    }

3 个答案:

答案 0 :(得分:65)

您可以将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();

答案 1 :(得分:0)

您只需在AsyncTask的构造函数中传递上下文。

<强> MyAsyncTask.java

public class MyAsyncTask extends AsyncTask<Void, Integer, List> {

    private final Context mContext;

    public MyAsyncTask(final Context context) {
         mContext = context;
    }
}

然后只需在onPostExecute()方法中使用mContext变量。

当您从MainActivity调用AsyncTask时,将上下文传递给MyAsyncTask的构造函数。

<强> MainActivity.java

final MyAsyncTask task = new MyAsyncTask(getApplicationContext());
task.execute();

答案 2 :(得分:0)

在尝试使用Async类压缩图像时遇到了相同的问题。我有一个构造函数,所以我只添加了以下内容

   public BackgroundImageResize(Context context, Bitmap bm) {
    if (bm != null){
        mBitmap = bm;
    }
    this.context =context;
}

然后我像下面这样叫课,

公共无效的uploadDevicePhoto(Uri imageUri){

BackgroundImageResize resize = new BackgroundImageResize(this,null);
resize.execute(imageUri);

}