在单独的类上执行runOnUiThread

the*_*ava 26 java android

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

我的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();
                }
            });
        }
}
Run Code Online (Sandbox Code Playgroud)

我如何在AsyncTask类中执行此方法?我收到一个错误的方法runOnUiThread(new Runnable(){}) is undefined for the type AdamTask

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

use*_*414 51

只需将上下文强制转换为Activity类

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

  • 救我脱掉重载的构造函数hehe typecasting救我tnx兄弟! (2认同)
  • 它并不总是有效,您必须确保所投射的内容实际上是一个Activity,否则您将拥有ClassCastException。为此,您可以执行“ if(context instanceOf Activity){//进行转换}” (2认同)

Ang*_*elo 35

你需要有Activity's引用(让我们命名activity)并将它传递给你的AsyncTask类.然后你可以runOnUiThread像这样打电话:

activity.runOnUiThread
Run Code Online (Sandbox Code Playgroud)

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

...

}
Run Code Online (Sandbox Code Playgroud)

然后打电话给AsyncTask你需要这样的东西:

AdamTask adamTask = new AdamTask(Eve.this);
adamTask.excecute(yourParams);
Run Code Online (Sandbox Code Playgroud)

更新正如Sam在评论中提到的,当配置发生更改时AsyncTasks可能会导致context泄漏(一个例子是屏幕旋转并Activity重新创建).解决这个问题的方法是无头fragment技术.

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