【问题标题】:how to use runOnUiThread without getting "cannot make a static reference to the non static method" compiler error如何使用 runOnUiThread 而不会出现“无法对非静态方法进行静态引用”编译器错误
【发布时间】:2015-06-05 17:59:55
【问题描述】:

我有一个主课;

  ClientPlayer extends Activity {

和服务

  LotteryServer extends Service implements Runnable {

当尝试在此服务的运行方法中使用 RunOnUiThread 时,我收到编译器错误“无法对非静态方法进行静态引用”

如何解决这个问题?这里显示了我是如何使用代码的;

     @Override
public void run() {
   // I tried both ClientPlayer.runOnUiThread and LotteryServer.runOnUiThread
   // both don't work   
    ClientPlayer.runOnUiThread(new Runnable() {
        public void run() {
           Toast.makeText(getApplicationContext(), "from inside thread", Toast.LENGTH_SHORT).show();
        }
    });
} // end run method

【问题讨论】:

    标签: android multithreading


    【解决方案1】:

    runOnUiThread 不是静态方法。

    如果你想在 UIThread 上运行你的 runnable 你可以使用这个

    Handler handler = new Handler(Looper.getMainLooper());

    这将为 UI 线程创建一个处理程序。

    ClientPlayer extends Activity {
    .
    .
    public static Handler UIHandler;
    
    static 
    {
        UIHandler = new Handler(Looper.getMainLooper());
    }
    public static void runOnUI(Runnable runnable) {
        UIHandler.post(runnable);
    }
    .
    .
    .
    }
    

    现在你可以在任何地方使用它了。

    @Override
    public void run() {
       // I tried both ClientPlayer.runOnUiThread and LotteryServer.runOnUiThread
       // both don't work   
        ClientPlayer.runOnUI(new Runnable() {
            public void run() {
               Toast.makeText(getApplicationContext(), "from inside thread", Toast.LENGTH_SHORT).show();
            }
        });
    } // end run method
    

    【讨论】:

    • 试过了,但是得到了上下文包装器的空指针。对于 Toast,我尝试了所有我能想到的情况,但它不起作用。我厌倦了从活动类传递上下文,但我不能这样做,因为在服务中你不能在构造函数中传递上下文
    • 当调用它的活动/服务被销毁或从未启动时,您可能会收到空指针异常,因此现在没有上下文可用于显示 toast。
    • 确保调用它的服务或活动已启动。
    【解决方案2】:

    上面的问题有一个非常简单的解决方案 只需在 onCreat() 方法之前对您的 Activity 进行静态引用

    MainActivity mn;
    

    然后在你onCreat()这样的方法中初始化它

    mn=MainActivity.this;
    

    然后你只需要用它来打电话给你的runOnUiThread

    mn.runOnUiThread(new Runnable() {
                        public void run() {
                            tv.setText(fns);///do what
                                        }
                                    });
    

    希望它有效。

    【讨论】:

      【解决方案3】:

      您可以获取 Activity 的实例,将其传递给服务,然后使用它来代替类名。

      那么你可以使用:

      yourActivity.runOnUiThread( ...
      

      【讨论】:

        【解决方案4】:

        当我们尝试从工作线程更新我们的 UI 时,通常我们使用此方法 (RunOnUiThread)。但是当您在这里使用服务时,runOnMainThread 根据您的情况似乎不合适。

        最好在此处使用 Handler。 Handler 是与创建的线程相关联的元素,您可以将带有代码的 runnable 发布到 Handler 中,该 runnable 将在创建 Handler 的线程中执行。

        在他的 MainThread 中为您的服务创建一个处理程序并在其上发布 Runnables 它/向它发送消息。

        【讨论】:

          猜你喜欢
          • 2013-03-31
          • 2019-07-13
          • 1970-01-01
          • 2011-06-25
          • 2023-04-02
          相关资源
          最近更新 更多