我有一个在C++中运行的线程,当某些条件满足时,它将调用我的UI线程(Java)静态方法.调用静态方法时,我希望在我的UI上显示Toast.我试过的是:
1
static void myMethod(){
Toast.makeText(context, "message", Toast.LENGTH_SHORT).show();
(I have a static context reference in global scope)
}
Run Code Online (Sandbox Code Playgroud)
结果:
E/AndroidRuntime( 1331): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Run Code Online (Sandbox Code Playgroud)
2
static void myMethod(){
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(Context, "message", Toast.LENGTH_SHORT).show();
}
});
Run Code Online (Sandbox Code Playgroud)
结果:
Can not compile: Cannot make a static reference to the non-static method runOnUiThread(Runnable) from the type Activity
Run Code Online (Sandbox Code Playgroud)
有人可以对此有所了解吗?非常感谢你.
我认为你从与UI线程不同的线程调用此方法,这会导致异常.我刚试过在我的Application类中声明一个静态方法,它会像你的第一个代码一样.它工作 - 但当然只有从主UI线程调用时.
如果您希望能够从其他线程调用静态方法,则需要在UI线程上创建一个处理程序以显示Toast.像这样的东西:
private static final int MSG_SHOW_TOAST = 1;
private static Handler messageHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == MSG_SHOW_TOAST) {
String message = (String)msg.obj;
Toast.makeText(App.this, message , Toast.LENGTH_SHORT).show();
}
}
};
private static void displayMessage() {
Message msg = new Message();
msg.what = MSG_SHOW_TOAST;
msg.obj = "Message to show";
messageHandler.sendMessage(msg);
}
Run Code Online (Sandbox Code Playgroud)
我的示例中的上下文是从App.this中检索的,它是Application类.您可以将其替换为您的Activity或静态全局上下文.
小智 5
static Activity thisActivity = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thisActivity = this;
}
public static void showMsg()
{
Toast.makeText(thisActivity, "message" , Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17140 次 |
| 最近记录: |