为什么onActivityResult()被工作线程阻止?

时间:2014-06-19 13:49:12

标签: java android multithreading cocos2d-x

我是多线程的新手,并且无法理解为什么在我的代码中永远不会调用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线程被某种方式阻止了?

1 个答案:

答案 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。