在异步调用中更改变量

Change variable inside async call

我正在尝试解析从我的 OkHttp3Connection 得到的 response 并且它几乎总是 return 我 String 的值 "true" 哪个在这个例子中是names[0]

现在我尝试根据响应将此字符串转换为布尔值和 return true/false。现在我想因为 OkHttp3Connection 需要一些时间它不会让查询完成并且 returns false 这是默认值。

我想说的是,无论 String names[0] 是什么,这个函数总是 returns false

public boolean checkIfSongPurhcased(String songName){

    final boolean[] songCheckResult = new boolean[1];

    OkHttp3Connection.doOkHttp3Connection("", Services_Url_class.GET_SONG_PURCHASED, OkHttp3Connection.Request_type.POST, request_data, new OkHttp3Connection.OkHttp3RequestCallback() {
                @Override
                public void onSuccess(String result, String userTag) throws JSONException {
                    JSONObject jsonResult = new JSONObject(result);
                    JSONArray data = jsonResult.getJSONArray("data");
                    if(data != null) {
                        String[] names = new String[data.length()];
                        for(int i = 0 ; i < data.length() ; i++) {
                            JSONArray arr = data.getJSONArray(i);
                            JSONObject dataObj = arr.getJSONObject(0);
                            Iterator<String> keys = dataObj.keys();
                            names[i] = dataObj.getString(keys.next());
                        }

                        //names[0] is "true"
                        songCheckResult[0] = Boolean.parseBoolean(names[0]);
                    }
                }
                @Override
                public void onError(String error, String userTag) {
                    System.out.println("songy" + error);
                }
            }
    );

    //always returns false
    return songCheckResult[0];

如果 names[0] is "true" 它会给我真实的结果,我怎样才能做到。

尝试使用 getBoolean() 而不是 getString()。

例如:names[i] = dataObj.getBoolean(keys.next());

你应该通过 listener/callback。

首先创建回调接口如下

public interface OnQueryResultCallback{
   void onQueryResult(String songName, boolean status);
}

然后把listener/callback传给你的方法,这里是修改后的方法

public void checkIfSongPurhcased(final String songName, final OnQueryResultCallback listener){
    OkHttp3Connection.doOkHttp3Connection("", Services_Url_class.GET_SONG_PURCHASED, OkHttp3Connection.Request_type.POST, request_data, new OkHttp3Connection.OkHttp3RequestCallback() {
                @Override
                public void onSuccess(String result, String userTag) throws JSONException {
                    JSONObject jsonResult = new JSONObject(result);
                    JSONArray data = jsonResult.getJSONArray("data");
                    if(data != null) {
                        String[] names = new String[data.length()];
                        for(int i = 0 ; i < data.length() ; i++) {
                            JSONArray arr = data.getJSONArray(i);
                            JSONObject dataObj = arr.getJSONObject(0);
                            Iterator<String> keys = dataObj.keys();
                            names[i] = dataObj.getString(keys.next());
                        }

                        //names[0] is "true"
                        boolean status = Boolean.parseBoolean(names[0]);
                        listener.onQueryResult(songName,status);
                    }
                }
                @Override
                public void onError(String error, String userTag) {
                    System.out.println("songy" + error);
                    listener.onQueryResult(songName,false);
                }
            }
    );
}

然后像下面这样调用 checkIfSongPurhcased

checkIfSongPurhcased("songName", new OnQueryResultCallback(){
   public void onQueryResult(String songName, boolean status){
        if(status){
          // do something on success
        }else{
         // do something on failure
        }
   }
});