我的Asyn类是一个单独的类文件。
public class AdamTask extends AsyncTask<String, Void, String>{
public void showToast(final String toast)
{
runOnUiThread(new Runnable() {
public void run()
{
Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
}
});
}
}
我如何在AsyncTask类中执行此方法?我收到错误方法runOnUiThread(new Runnable(){}) is undefined for the type AdamTask
new AdamTask(Eve.this,How to pass the eve activity here
)。execute();
答案 0 :(得分:48)
只需将上下文强制转换为Activity类
((Activity)context).runOnUiThread(new Runnable()
{
public void run()
{
Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
}
});
答案 1 :(得分:32)
您需要Activity's
引用(让我们将其命名为activity
)并将其传递给您的AsyncTask
课程。然后你可以这样打电话给runOnUiThread
:
activity.runOnUiThread
runOnUiThread是Activity
类中定义的方法。
只需在AsyncTask中添加一个contsructor即可。您的AsyncTask将如下所示:
public class AdamTask extends AsyncTask<String, Void, String> {
private Activity activity; //activity is defined as a global variable in your AsyncTask
public AdamTask(Activity activity) {
this.activity = activity;
}
public void showToast(final String toast)
{
activity.runOnUiThread(new Runnable() {
public void run()
{
Toast.makeText(activity, toast, Toast.LENGTH_SHORT).show();
}
});
}
...
}
然后调用AsyncTask
你需要这样的东西:
AdamTask adamTask = new AdamTask(Eve.this);
adamTask.excecute(yourParams);
更新正如Sam在评论中提到的,AsyncTasks
可能会在发生配置更改时导致context
泄漏(一个示例是屏幕旋转时Activity
重新创建)。解决这个问题的方法是headless fragment
technique。
另一种更高效的方法是使用事件总线。有关详细信息,请参阅here(Sam在评论中提供的链接)。
答案 2 :(得分:4)
您需要Activity对象才能执行此操作。通过构造函数传递Activity的this引用,并在AsyncTask中使用它。
public class AdamTask extends AsyncTask<String, Void, String>{
public void showToast(final String toast)
{
activityObj.runOnUiThread(new Runnable() {
public void run()
{
Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
}
});
}
}
由于runOnUiThread是Activity类中的公共方法,因此您不能在除Activity之外的其他一些Custom类或类中使用它。
看这里,runonUi.
如果您不清楚,请检查此answer以了解如何通过构造函数发送活动对象