我有一个主要课程;
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
答案 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上发布 它/发送消息给它。