如何在顶级AsyncTask类中进行敬酒

时间:2018-11-16 01:19:11

标签: android android-asynctask android-toast

我有一个扩展了AsyncTask的顶级Fetch类,并且有一个MainActivity。由于没有MainActivity实例或其上下文,因此无法获取Fetch类。我试图将MainActivity传递给Fetch类,但它可能会泄漏内存。我曾尝试设置上下文的WeakReference实例,但不能为此敬酒。

我读过许多其他有关此的文章,大多数似乎都有一个静态的内部类,但是我的是顶级的,我希望保持这种状态。

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

2 个答案:

答案 0 :(得分:1)

一种方式,以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();

答案 1 :(得分:0)

是的,请放心,您可以使用应用程序上下文。可能如下:

  

在应用程序中实现App.getContext()。

并在“ Fetch”类中使用它,并在MainThread中执行它。