在单独的类上执行runOnUiThread

可能重复:
Android如何在其他类中运行OuUiThread?

我的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

新的AdamTask(Eve.this, How to pass the eve activity here ).execute();

Solutions Collecting From Web of "在单独的类上执行runOnUiThread"

你需要有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); 

更新正如山姆在评论中提到的, AsyncTasks可能会导致context泄漏时发生configuration更改(一个示例是当屏幕旋转,并重新创buildActivity )。 解决这个问题的方法是无头fragment技术 。

另一种更高效的方法是使用事件总线。 在这里看到更多的信息(在评论中由山姆提供的链接)。

只要将类的上下文types化即可

 ((Activity)context).runOnUiThread(new Runnable() { public void run() { Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); } }); 

你需要你的Activity对象来做到这一点。 通过构造函数传递你的Activity的这个引用,并在你的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。

看这里, runonUi。

如果您不清楚,请检查此答案,以了解如何通过构造函数发送Activity对象