我是多线程的新手,并且无法理解为什么在我的代码中永远不会调用onActivityResult()。
我需要暂停一个线程,直到我需要的变量发生变化。我使用jni从cocos2d-x调用java函数ShowFileDialog(),并从UI线程以外的线程调用它。然后我开始活动从库中选择一个图像,所有这一切都在UI线程上完成。之后我需要等到更改filePath变量,并且何时发生 - 将filePath字符串返回到cocos2d-x。
这是我的代码:
private static MyActivity thisActivity;
private static String filePath;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
thisActivity = this;
}
public static String ShowFileDialog() {
filePath = new String();
thisActivity.runOnUiThread(new Runnable() {
public void run() {
Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
photoPickerIntent.setType("image/*");
thisActivity.startActivityForResult(photoPickerIntent, 1);
}
});
synchronized(filePath)
{
try {
filePath.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return filePath;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
...
filePath.notifyAll();
}
启动Intent的活动,但永远不会调用onActivityResult()。我无法理解它为什么会发生 - 它是否意味着UI线程被某种方式阻止了?
答案 0 :(得分:1)
filePath.wait()在GLSurfaceView中阻止你的GLThread,因为从GLThread调用了Cocos2d-x mainloop。并且调用startActivityForResult()将调用当前活动Activity的onPause(),即它的Cocos2dxActivity。 Cocos2dxActivity.onPause()将调用GLSurfaceView.onPause()。 GLSurfaceView.onPause()将调用sGLThreadManager.wait()。但是你的代码阻止了GLThread。因此会发生死锁。
我建议您使用回调机制而不是仅仅等待GLThread。在这种情况下,您可以使用此CCImagePicker。