在单独的类上执行runOnUiThread

时间:2012-10-26 11:33:12

标签: java android

  

可能重复:
  Android how to runOnUiThread in other class?

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

3 个答案:

答案 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

runOnUiThreadActivity类中定义的方法。

只需在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以了解如何通过构造函数发送活动对象