簡體   English   中英

如何將上下文傳遞給 AsyncTask?

[英]How to pass Context to AsyncTask?

如何在Async Task類中傳遞上下文,該類是在與Main Activity不同的 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();
    }

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

您可以在 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 的構造函數。

主活動.java

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

我在嘗試使用 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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM