Nếu bạn làm theo các bước sau để triển khai OKHTTP, thì chắc chắn bạn sẽ gọi nhiều API trên nhiều màn hình bằng cách áp dụng chỉ có hai dòng mã
UpdateListener updateListener = new UpdateListener(HitAPIActivity.this, baseHTTPRequest);
updateListener.getJsonData();
Bước 1:
baseHTTPRequest = new BaseHTTPRequest();
// baseHTTPRequest.setURL("https://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demohttps://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo");
baseHTTPRequest.setURL("http://jsonparsing.parseapp.com/jsonData/moviesDemoItem.txt");
baseHTTPRequest.setRequestCode(reqType);
baseHTTPRequest.setCachedRequired(true);
UpdateListener updateListener = new UpdateListener(HitAPIActivity.this, baseHTTPRequest);
updateListener.executeRequest();
Bước 2: Tạo một lớp yêu cầu
/** * Tạo bởi Deepak Sharma vào ngày 4/7/16. * Đây là lớp yêu cầu HTTP có các tham số cơ bản. * Nếu bạn muốn thêm một số thông số khác, hãy tạo một lớp con của lớp đó * và thêm với lớp con của bạn. Không sửa đổi lớp này. */
public class BaseHTTPRequest<T> {
private Context context;
private String URL;
private int requestCode;
private List<T> listParameters;
private String header;
private boolean isCachedRequired;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public void setURL(String URL) {
this.URL = URL;
}
public String getURL() {
return URL;
}
public int getRequestCode() {
return requestCode;
}
public void setRequestCode(int requestCode) {
this.requestCode = requestCode;
}
public List<T> getListParameters() {
return listParameters;
}
public void setListParameters(List<T> listParameters) {
this.listParameters = listParameters;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
public boolean isCachedRequired() {
return isCachedRequired;
}
public void setCachedRequired(boolean cachedRequired) {
isCachedRequired = cachedRequired;
}
}
bước 4: Tạo một lớp người nghe
nhập khẩu android.util.Log; nhập com.google.gson.Gson; nhập java.io.IOException; nhập dxswifi_direct.com.wifidirectcommunication.base.model.request.BaseHTTPRequest; nhập okhttp3.Call; nhập okhttp3.MediaType; nhập okhttp3.OkHttpClient; nhập okhttp3.Callback; nhập okhttp3.Request; nhập okhttp3.RequestBody; nhập okhttp3.Response;
/** * Được tạo bởi Deepak Sharma vào ngày 4/7/16. * @email: [email protected] * Đây là lớp java đơn giản sẽ giúp bạn yêu cầu/trả lời HTTP và nó sẽ * gửi phản hồi đến hoạt động tương ứng của bạn. */
public class UpdateListener {
private OnUpdateViewListener onUpdateViewListener;
OkHttpClient okHttpClient = new OkHttpClient();
BaseHTTPRequest mRequestModel;
private String mURL = null;
private Request mRequest = null;
public interface OnUpdateViewListener {
void updateView(String responseString, boolean isSuccess,int reqType);
}
public UpdateListener(OnUpdateViewListener onUpdateView, final BaseHTTPRequest requestModel) {
this.mRequestModel = requestModel;
this.onUpdateViewListener = onUpdateView;
if (requestModel.isCachedRequired())
{
/*File httpCacheDirectory = new File(requestModel.getContext().getCacheDir(), "responses");
Cache cache = null;
cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
if (cache != null) {
okHttpClient.setCache(cache);
}*/
}
/*mURL = null;
if (requestModel.getListParameters()!=null && requestModel.getListParameters().size()>0)
{
HttpUrl.Builder urlBuilder = HttpUrl.parse(requestModel.getURL()).newBuilder();
List<RequestParameter> requestParameters = requestModel.getListParameters();
for (int i=0; i<requestParameters.size();i++)
{
urlBuilder.addQueryParameter(requestParameters.get(i).getKey(),requestParameters.get(i).getValue());
}
mURL = urlBuilder.build().toString();
}
else
{
mURL = requestModel.getURL();
}*/
mURL = requestModel.getURL();
if (mRequestModel.getListParameters()!=null && mRequestModel.getListParameters().size()>1)
{
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
mRequest = new Request.Builder()
.url(mURL)
.post(RequestBody.create(JSON, new Gson().toJson(BaseHTTPRequest.class)))
.build();
}
else
{
mRequest = new Request.Builder()
.url(mURL)
.build();
}
}
public void executeRequest()
{
Call call = okHttpClient.newCall(mRequest);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
onUpdateViewListener.updateView(NetworkException.getErrorMessage(e), false, mRequestModel.getRequestCode());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
// You can also throw your own custom exception
throw new IOException("Unexpected code " + response);
} else {
Log.i("Response:",response.toString());
Log.i("Response body:",response.body().toString());
Log.i("Response message:",response.message());
onUpdateViewListener.updateView(response.body().string(),true, mRequestModel.getRequestCode());
}
// do something wih the result
}
});
}
}
bước 5: Từ hoạt động bạn yêu cầu, thực hiện nghe
public class HitAPIActivity extends AppCompatActivity implements View.OnClickListener, UpdateListener.OnUpdateViewListener{
@Override
public void updateView(final String responseString, boolean isSuccess, int reqType) {
if (isSuccess)
{
if (!responseString.contains("failure")
&& !responseString.contains("Error")) {
// Handle request on the basis of Request Type.
switch (reqType) {
case ApiConstants.GET_CONTACTS:
break;
default:
break;
}
}
}
}
thể trùng lặp của [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/ android-os-networkonmainthreadexception) Bạn có nghĩ đến việc tìm kiếm trước không? – Simon
Nó không liên quan gì đến điều đó .. Đọc lại câu hỏi. Đặc biệt là các bộ phận in đậm. Bạn có nghĩ về việc đọc trước không? –
Tôi đã đọc câu hỏi và mọi thứ liên quan đến điều đó. Bạn đang dong mạng IO trên chủ đề chính. Nó không quan trọng bạn nghĩ gì ** thư viện đang làm, chỉ có một nguyên nhân của ngoại lệ này. – Simon