29

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

My Asyn Classes 是一个单独的类文件。

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

4

3 回答 3

57

只需将上下文类型转换为 Activity 类

((Activity)context).runOnUiThread(new Runnable()
    {
        public void run()
        { 
             Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
        }
    });
于 2012-10-26T11:52:18.503 回答
39

您需要Activity's参考(让我们命名activity)并将其传递给您的AsyncTask班级。然后你可以runOnUiThread这样调用:

activity.runOnUiThread

runOnUiThread是类中定义的方法Activity

只需向您的 AsyncTask 添加一个构造函数。您的 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重新创建时)。解决这个问题的一种方法是无头fragment技术

另一种更有效的方法是使用事件总线。有关更多信息,请参见此处(Sam 在评论中提供的链接)。

于 2012-10-26T11:40:53.937 回答
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 本身之外扩展的类中使用它。

看这里,runonUi。

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

于 2012-10-26T11:35:05.943 回答