gpt4 book ai didi

java - 为什么 onActivityResult() 被工作线程阻塞?

转载 作者:行者123 更新时间:2023-12-01 12:49:55 24 4
gpt4 key购买 nike

我是多线程的新手,不明白为什么我的代码中从未调用 onActivityResult() 。

我需要暂停线程,直到我需要的变量发生更改。我使用 jni 从 cocos2d-x 调用 java 函数 ShowFileDialog(),并且它是从 UI 线程以外的线程调用的。然后我开始从图库中选择图像的 Activity ,所有这些都是在 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 中的 Activity 已启动,但从未调用 onActivityResult()。我不明白为什么会发生这种情况 - 这是否意味着 UI 线程被某种方式阻塞了?

最佳答案

filePath.wait() 会阻塞 GLSurfaceView 中的 GLThread,因为 Cocos2d-x 主循环是从 GLThread 调用的。调用startActivityForResult()会导致调用当前 Activity Activity的onPause(),它是Cocos2dxActivity。 Cocos2dxActivity.onPause() 会调用 GLSurfaceView.onPause()。 GLSurfaceView.onPause() 将调用 sGLThreadManager.wait()。但是 GLThread 被您的代码阻止了。这样就会出现死锁。

我建议您使用回调机制,而不是仅仅等待 GLThread。在这种情况下,您也许可以使用此 CCImagePicker。

关于java - 为什么 onActivityResult() 被工作线程阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com