如何在顶级 AsyncTask 中做 Toast class

How to make a Toast in top-level AsyncTask class

我有一个扩展 AsyncTask 的顶级 Fetch class,我有一个 MainActivity。由于没有 MainActivity 或其上下文的实例,我无法让 Fetch class 敬酒。我试图将 MainActivity 传递给 Fetch class 但它可能会泄漏内存。我已尝试设置上下文的 WeakReference 实例,但我无法为此干杯。

我读过许多关于此的其他帖子,大多数似乎都有一个静态内部-class,但我的是顶级的,我更愿意保持这种状态。

MainActivity 创建一个 Fetch 实例,然后执行它。

public class Fetch extends AsyncTask<Void, Integer, List<List<String>>>
    {
    @Override
    protected void onPreExecute()
        {
        super.onPreExecute();
        }
    @Override
    protected List<List<String>> doInBackground(Context... params)
        {
        // run tasks
        }
    @Override
    protected void onProgressUpdate(Integer... progress)
        {
        }
    @Override
    protected void onPostExecute(List<List<String>> result)
        {
        super.onPostExecute(result);
        }
    }

一种方式,在doInBackground:

runOnUiThread(new Runnable() {
public void run() {
        Toast.makeText(<your class name>.this, "hello", Toast.LENGTH_SHORT).show();
    }
});

或在onPostExecute(后台计算完成后在UI线程上调用)

Toast.makeText(<your class name>.this, "hello", Toast.LENGTH_SHORT).show();

编辑:如果你想将上下文传递给AsyncTask,你可以这样做:

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

    private final Context mContext;

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

而在MainActivity中:

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

再次编辑: 我成功测试了 WeakReference。

public class ExampleAsyncTask extends AsyncTask {
    private WeakReference<Context> contextRef;

    public ExampleAsyncTask(Context context) {
        contextRef = new WeakReference<>(context);
    }


    @Override
    protected void onPostExecute(Object result) {
        Context context = contextRef.get();
        if (context != null) {
            Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show();
        }
    }
}

在 MainActivity 中:

  new ExampleAsyncTask(MainActivity.this).execute();

是的,不用担心,您可以使用应用context.may如下:

implement your App.getContext() in your Application.

并在您的 "Fetch" class 中使用它并在 MainThread 中执行它。