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

Kev*_*vik 12 multithreading android

我有一个主要班级;

  ClientPlayer extends Activity {
Run Code Online (Sandbox Code Playgroud)

和服务

  LotteryServer extends Service implements Runnable {
Run Code Online (Sandbox Code Playgroud)

当尝试在此服务的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
Run Code Online (Sandbox Code Playgroud)

Viv*_*wal 19

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);
}
.
.
.
}
Run Code Online (Sandbox Code Playgroud)

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

@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
Run Code Online (Sandbox Code Playgroud)


Sye*_*rah 13

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

MainActivity mn;
Run Code Online (Sandbox Code Playgroud)

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

mn=MainActivity.this;
Run Code Online (Sandbox Code Playgroud)

之后你只需用它来打电话给你 runOnUiThread

mn.runOnUiThread(new Runnable() {
                    public void run() {
                        tv.setText(fns);///do what
                                    }
                                });
Run Code Online (Sandbox Code Playgroud)

希望它有用.


Ale*_*ier 5

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

然后你可以使用:

yourActivity.runOnUiThread( ...
Run Code Online (Sandbox Code Playgroud)