13

我有一个主要课程;

  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
4

4 回答 4

20

runOnUiThread 不是静态方法。

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

处理程序 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
于 2013-02-21T07:37:18.387 回答
13

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

MainActivity mn;

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

mn=MainActivity.this;

然后你只需要用它来调用你的runOnUiThread

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

希望它有效。

于 2015-06-05T09:59:55.710 回答
5

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

那么你可以使用:

yourActivity.runOnUiThread( ...
于 2013-02-21T07:27:48.127 回答
0

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

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

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

于 2013-02-21T07:27:37.047 回答