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

我有一个主要的课程,

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 

Solutions Collecting From Web of "如何使用runOnUiThread而不会收到“无法对非静态方法进行静态引用”的编译器错误"

runOnUiThread不是一个静态方法。

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

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

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

 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 

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

 MainActivity mn; 

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

 mn=MainActivity.this; 

之后你只需要使用它来调用你的runOnUiThread

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

希望它的工作。

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

那么你可以使用:

 yourActivity.runOnUiThread( ... 

通常我们使用这种方法(RunOnUiThread),当我们尝试从工作线程更新我们的用户界面。 但是因为你在这里使用服务, runOnMainThread似乎不适合你的情况。

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

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