【问题标题】:executing runOnUiThread on a separate class [duplicate]在单独的类上执行 runOnUiThread [重复]
【发布时间】:2012-10-26 11:33:11
【问题描述】:

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

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

【问题讨论】:

    标签: java android


    【解决方案1】:

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

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

    【讨论】:

    • 让我免于重新创建重载的构造函数嘿嘿类型转换救我 tnx 兄弟!
    • 非常感谢。你拯救了这一天:)
    • 它并不总是有效,您必须确保您正在投射的内容实际上是一个 Activity,否则您将遇到 ClassCastException。为此,您可以执行“if(context instanceOf Activity){ // 继续转换 }”
    • 还有 Kotlin 版本,9 年后 ? (context as Activity).runOnUiThread{ Timber.d(gson.toJson(playlists)) }
    【解决方案2】:

    您需要拥有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 在 cmets 中提到的,AsyncTasks 可能会在配置更改发生时导致 context 泄漏(一个示例是屏幕旋转并重新创建 Activity 时)。处理此问题的一种方法是headless fragment technique

    另一种更有效的方法是使用事件总线。更多信息请参见here(链接由 Sam 在 cmets 中提供)。

    【讨论】:

    【解决方案3】:

    您需要您的 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.

    如果不清楚,请查看answer了解如何通过构造函数发送Activity Object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 2014-07-12
      • 2013-06-13
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多