簡體   English   中英

從OKhttp獲取字符串響應

[英]getting String response from OKhttp

我想在建立連接后獲得對主要活動的字符串JSON響應,我知道它在不同的線程中運行,所以請幫助我如何獲取它,然后從該方法返回它;

public class MakeNetworkConnection {

    private String mBaseUrl;
    private String mApiKey;
    private String mContentType;
    private String mJsonResponce;

    public MakeNetworkConnection(String baseUrl, String apiKey, String contentType) {
        mBaseUrl = baseUrl;
        mApiKey = apiKey;
        mContentType = contentType;
    }
    public String startNetworkConnection() throws IOException {

        OkHttpClient client=new OkHttpClient();
        Request request=new Request.Builder().url("http://content.guardianapis.com/sections?api-key=1123456").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 {
                if(response.isSuccessful()){
                    mJsonResponce=response.body().string();
                }
            }
        });

       return mJsonResponce; 
    }
}

這里的問題是關於了解異步任務如何工作。 當您調用client.newCall(request).enqueue(new Callback() ,它將在后台線程中運行(在主線程之外),並且控制權將傳遞到return mJsonResponce;的下一行return mJsonResponce;因此,它將始終返回null

您應該做的是傳遞一個回調方法,該方法將在響應成功時被調用。 您可以創建一個接口以返回結果:

public interface NetworkCallback {
   void onSuccess(String repsonse);
   void onFailure();
}

在發出網絡請求時傳遞此接口的對象,並在網絡請求完成時調用適當的方法。

您還要注意的另一件事是, OkHttp不會在主線程上返回響應,因此,如果您要更新任何UI,則必須在UI /主線程上返回響應。 這樣的事情會起作用。

@Override
public void onResponse(Call call, Response response) throws IOException {
      if(response.isSuccessful()){
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                       @Override
                       public void run() {
                          //return response from here to update any UI
                          networkCallback.onSuccess(response.body().string());
                       }
               });
      }
}

您可以與execute()同步使用,而不是異步使用調用。

public String startNetworkConnection() throws IOException {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
                 .url("http://content.guardianapis.com/sections?api-key=1123456")
                 .build();
    return client.newCall(request)
                 .execute()
                 .body()
                 .string();
}

根據Rohit Arya的建議,我做了以下工作:

public class OkHttpUtil {


public interface OKHttpNetwork{
     void onSuccess(String body);
     void onFailure();
}

public void startConnection(String url, final OKHttpNetwork okHttpCallBack) throws IOException {
    OkHttpClient client=new OkHttpClient();
    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 {
            if (response.isSuccessful()){

                okHttpCallBack.onSuccess(response.body().string());
                }
            }
        });
    }
}

在MainActvity中,我執行了以下操作:

        OkHttpUtil okHttpUtil=new OkHttpUtil();
    try {
        okHttpUtil.startConnection("http://content.guardianapis.com/sections?api-key=8161f1e9-248b-4bde-be68-637dd91e92dd"
                , new OkHttpUtil.OKHttpNetwork() {
                    @Override
                    public void onSuccess(String body) {
                        final String jsonResponse=body;
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //show the response body
                                Toast.makeText(MainActivity.this,jsonResponse, Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                    @Override
                    public void onFailure() {
                    //do something
                    }
                });
    } catch (IOException e) {
        e.printStackTrace();
    }

更改此行

mJsonResponce=response.body().toString();

mJsonResponce=response.body().string();

希望對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM