如何在顶级 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 中执行它。
我有一个扩展 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 中执行它。