如何使用runOnUiThread而不会得到“无法对非静态方法进行静态引用”编译错误

时间:2013-02-21 07:15:44

标签: android multithreading

我有一个主要课程;

  ClientPlayer extends Activity {

和服务

  LotteryServer extends Service implements Runnable {

当尝试在此服务的run方法中使用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

4 个答案:

答案 0 :(得分:17)

runOnUiThread不是静态方法。

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

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

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

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

答案 1 :(得分:13)

对上述问题有一个非常简单的解决方案 只需在onCreat()方法

之前创建活动的静态参考
MainActivity mn;

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

mn=MainActivity.this;

之后您只需使用它来拨打runOnUiThread

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

希望它有效。

答案 2 :(得分:5)

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

然后你可以使用:

yourActivity.runOnUiThread( ...

答案 3 :(得分:0)

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

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

  

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