鍍金池/ 問答/Java  Android/ 如何在外部函數(shù)返回okhttp獲取到的json字符串?

如何在外部函數(shù)返回okhttp獲取到的json字符串?

我想用一個(gè)方法來返回okhttp返回的json字符串,但是一直沒法從里面拿到result。

class MyOkHttp {
    String getJson(String finalUrl) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder().url(finalUrl).build();
                Response response = null;
                try {
                    response = client.newCall(request).execute();
                    if (response.isSuccessful()) {
                        String result = response.body().string();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        
        return null;
    }
}

之前的例子不太標(biāo)準(zhǔn)


    class Client {
    String q;
    String url;
    Bean bean = new Bean();

    String getCon(String q) throws UnsupportedEncodingException {
        this.q = q;
        Encoder encoder = new Encoder();
        url = encoder.encode(q);
        final OkHttpClient client = new OkHttpClient();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Request request = new Request.Builder().url(url).build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String result = response.body().string();
                        JSONObject jsonObj = JSONObject.fromObject(result);
                        bean.setErrorCode(jsonObj.getInt("errorCode"));
                        if (bean.getErrorCode() != 0)
                            return;
                        JSONArray jsonArray = jsonObj.getJSONArray("translation");
                        bean.setTranslation(jsonArray.getString(0));
                        System.out.println(bean.getTranslation());
                    }
                });

            }
        }).start();
        return bean.getTranslation();
    }
}

回答
編輯回答
熟稔

android中的異步機(jī)制你都沒搞明白,你開起了一個(gè)線程,然后想直接從線程獲取到同步數(shù)據(jù),這個(gè)怎么可能,而且你還是只返回 null ,這個(gè)代碼問題太多

2018年9月21日 01:43
編輯回答
兔囡囡

使用Callable和Future試試

2018年5月18日 20:33
編輯回答
默念

哈哈,你這讓我想起我剛學(xué) Android 的時(shí)候,完全不理解回調(diào)的原理。

https://www.zhihu.com/questio...

可以看看,去理解一下回調(diào)是什么東西。

至于你的這個(gè)例子,我試著用用記事本寫一個(gè)偽代碼的吧。(很久沒寫過java了,手有點(diǎn)生。

//首先定義一個(gè)回調(diào)接口
interface MyCallback {
    void onSuccess(String json);
}

void getJson(String q, MyCallback callback) {
  client.newCall(request).enqueue(new Callback(){
    //@override
    //...onFailure(...)
    @override
    public void onResponse(Call call , Response reponse){
        String result = response.body().string();
        JSONObject jsonOjb = ...
        String translation = jsonObj.getJSONArray("translation");
        callback.onSuccess(translation);
    }
  })
}


void test(){
  //調(diào)用的話,就這么調(diào)用
  getJson("qqqq",new MyCallBack(){
      @override
    void onSuccess(String json){
      System.out.println("json result is " + json)
    }
  })
 
}
2017年4月6日 00:27
編輯回答
刮刮樂

通過回調(diào)方法進(jìn)行,如果要刷新View的話需要利用到handler,你覺得復(fù)雜不明晰可以利用Rxjava來進(jìn)行。

2017年7月5日 01:53