我有一个扩展了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);
}
}
答案 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中执行它。