我有一个原生的C
函数(当然是 JNI )应该回调一个java方法来显示一个对话框,但是这个对话框永远不会显示。
这是如何工作的:
showDialog(SOME_ID)
onCreateDialog(SOME_ID)
被称为AlertDialog.Builder
AlertDialog alert = builder.create()
时,应用程序就在那里停止(没有崩溃或冻结),但是当从C代码开始此调用时仅。代码如下:
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case SOME_ID:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Message");
builder.setPositiveButton(...);
builder.setNegativeButton(...);
AlertDialog alert = builder.create();
System.out.println("...Never called from JNI");
return alert;
}
return null;
}
在 6 中,我的意思是我在调用builder.create()
之后在和之前记录了一些内容,但在<{strong>之后<{strong>} {{1}永远不会调用方法,因此方法永远不会返回,并且永远不会创建对话框。我有一个按钮来触发对话框,正如预期的那样,它可以工作。
我做了另一个测试,我打印create
直接从getApplicationContext()
和onCreate()
(从C代码调用)调用它是相同的,因为我认为的第一件事是从另一个Context或其他东西调用onCreateDialog()。
你知道对话框没有显示的原因吗?
答案 0 :(得分:1)
问题是当从JNI回调时,应用程序不在UI线程上,因此对话框从未显示过。为了解决这个问题,我使用了Handler(在Activity上):
public final Handler dialogHandler = new Handler(){
public void handleMessage(Message msg){
showDialog(SOME_ID);
}
};
因此,我不是直接致电showDialog()
而是致电dialogHandler.sendMessage()
。