【问题标题】:The method runOnUiThread(Runnable) in the type Activity is not applicable for the arguments (void)Activity 类型中的方法 runOnUiThread(Runnable) 不适用于参数(void)
【发布时间】:2011-03-31 02:19:46
【问题描述】:

我正在尝试在 onUtteranceCompleted() 中从非 UI 线程创建一个对话框:

runOnUiThread(
    new Thread(new Runnable() {
      public void run() { MyDialog.Prompt(this); }
    }).start());

Prompt() 是 MyDialog 类的一个简单的静态方法:

  static public void Prompt(Activity activity) {
    MyDialog myDialog = new MyDialog();
    myDialog.showAlert("Alert", activity);     
  }

问题是我正在尝试做的事情有两个错误:

  1. 方法runOnUiThread(Runnable) 在类型活动不是 适用于参数(无效)
  2. 中的方法 Prompt(Activity) MyDialog 类型不适用 对于参数 (new Runnable(){})

我想要的只是通过将对话框创建推迟到 UI 线程来“做正确的事”,但似乎我缺少一些基本的东西。

我缺少什么以及如何完成我想要完成的看似简单的任务?

【问题讨论】:

    标签: android dialog thread-safety runnable ui-thread


    【解决方案1】:

    一定是:

    runOnUiThread(new Runnable() {
          public void run() { MyDialog.Prompt(NameOfYourActivity.this); }
        });
    

    它说 不适用于参数 (void),因为您正在尝试使用 start 方法(这是一个 void 方法)运行线程。 runOnUiThread 接收到一个可运行的对象,您不必担心启动它,这是由操作系统为您完成的。

    关于第二个错误,这是因为在该范围内 this 指的是您正在初始化的 Runnable 对象,而不是对活动的引用。因此,您必须明确说明您所指的this(在本例中为YourActivityName.this)。

    【讨论】:

    • 你是个天才。非常感谢!
    • 看来只能在Activity中使用runOnUiThread,没有别的了。
    • 是的,没错……这是唯一有意义的地方。
    • 我将“this”保存在最终上下文变量中:final Context ctx;然后在调用我的方法时使用它: public void run(){ try { myList =MyStaticClass.getInstance(ctx);}catch{(Exception e){}
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2012-06-24
    • 2014-06-26
    相关资源
    最近更新 更多