[英]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.