Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Android int值的React本机模块延迟返回?_Javascript_Java_Android_React Native_React Native Android - Fatal编程技术网

Javascript Android int值的React本机模块延迟返回?

Javascript Android int值的React本机模块延迟返回?,javascript,java,android,react-native,react-native-android,Javascript,Java,Android,React Native,React Native Android,我有一个原生Android应用程序,现在有了一个React原生部分 简而言之,我有一个原生Android/Java的列表视图。当我点击一行时,我会启动一个新的活动,该活动将导致React本机代码 组件进行API调用,但在调用之前,我的代码将通过React Native模块从Java/Android设置中的用户首选项中获取一个值,以便进行适当的API调用 /actions/index.js中的React本机API调用: export const toggleBlocked = (user_id)

我有一个原生Android应用程序,现在有了一个React原生部分

简而言之,我有一个原生Android/Java的列表视图。当我点击一行时,我会启动一个新的活动,该活动将导致React本机代码

组件进行API调用,但在调用之前,我的代码将通过React Native模块从Java/Android设置中的用户首选项中获取一个值,以便进行适当的API调用

/actions/index.js
中的React本机API调用:

export const toggleBlocked = (user_id) =>
async dispatch => {
  try {
    let headers = await getHeaders();
    const response = await fetch('http://my.domain.com/api/get_data?user_id=`${user_id}`', { headers, method: 'GET' });
    if (response.status == 200) {
      // do stuff
    } else {            
      ToastAndroid.show("Looks like the response wasnt good :(", ToastAndroid.LONG, ToastAndroid.CENTER);
    }
  } catch (error) {
    ToastAndroid.show("An Error Occurred :(", ToastAndroid.LONG, ToastAndroid.CENTER);
  }
};


function getHeaders() {
  let userId = UserService.getUserId()
  console.log("2. React-Native | getHeaders... user_id is " + userId)
  return (
    new Headers({
      Cookie: `abcxyz=${userId}`,
      user_id: userId,
      "User-Agent": "android",
      "Content-Type": "application/json",
      charset: "utf-8",
      "app-version": "9.1.23",
      Accept: "application/json"
    })
  )
}
回到原生Android/Java,我已经设置了模块和包。下面是
UserServiceModule.java

    @ReactMethod
    public int getUserId() {
        SharedPreferences settings = mContext.getSharedPreferences(Constants.SettingsPreference, Context.MODE_PRIVATE);
        int userId = settings.getUserId();
        Log.d(TAG, "1. Java/Android code. UserID is " + userId);
        return userId;
    }
当我运行代码时,user_id总是空的。我甚至希望我的日志按顺序显示(参见编号的日志),但它们是相反的

"1. Java/Android code. UserID is 123"
"2. React-Native | getHeaders... user_id is 123"
请提供任何见解。谢谢

更新/解决方案 以下是使事情正常运行的更新更改:

@ReactMethod
public void getUserId(final Promise promise) {
    SharedPreferences settings = mContext.getSharedPreferences(Constants.SettingsPreference, Context.MODE_PRIVATE);
    int userId = settings.getUserId();
    Log.d(TAG, "1. Java/Android code. UserID is " + userId);

    promise.resolve(Integer.toString(userId));
}

@ReactMethod函数总是假定返回void并且是异步的。获取null的原因是JS代码是同步编写的。它将变量userId初始化为null,并使用异步调用的返回值设置它。但是因为您编写的代码是同步的,所以在react方法返回值之前,它将转到下一行

您将需要像使用分派方法一样执行异步等待。但是,这还不够,因为react方法返回一个void值。坦白地说,我不知道一个未找到的方法错误是如何被触发的。也许@ReactMethod会忽略您在Java中定义的返回值

不管怎样,在设置异步后等待。做一些类似于他们在这里所做的事情:

在@ReactMethod中设置
isBlockingSynchronousMethod=true

例如:

@ReactMethod(isBlockingSynchronousMethod = true)
public String getString(){
    return "awesome string";
}
在js文件中:

var someString = await NativeModule.ModuleName.getString();

谢谢,我刚刚给我指出了正确的方向,我刚刚更新了上面的帖子,加入了最终的代码!