توی فایل Build.gradle در بلاک android هم این خط رو قرار بدید:
useLibrary 'org.apache.http.legacy'
توی فایل Build.gradle در بلاک dependencies این خط رو قرار بدید:
compile 'dev.dworks.libs:volleyplus:+'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
کلاس OkHttpStack:
public class OkHttpStack implements HttpStack {
private final OkHttpClient mClient;
public OkHttpStack(OkHttpClient client) {
this.mClient = client;
}
@Override
public HttpResponse performRequest(Request<?> request,
Map<String, String> additionalHeaders) throws IOException,
AuthFailureError {
okhttp3.Request.Builder okHttpRequestBuilder = new okhttp3.Request.Builder();
okHttpRequestBuilder.url(request.getUrl());
Map<String, String> headers = request.getHeaders();
for (final String name : headers.keySet()) {
okHttpRequestBuilder.addHeader(name, headers.get(name));
}
for (final String name : additionalHeaders.keySet()) {
okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name));
}
setConnectionParametersForRequest(okHttpRequestBui lder, request);
okhttp3.Request okHttpRequest = okHttpRequestBuilder.build();
Call okHttpCall = mClient.newCall(okHttpRequest);
Response okHttpResponse = okHttpCall.execute();
StatusLine responseStatus = new BasicStatusLine(
parseProtocol(okHttpResponse.protocol()),
okHttpResponse.code(), okHttpResponse.message());
BasicHttpResponse response = new BasicHttpResponse(responseStatus);
response.setEntity(entityFromOkHttpResponse(okHttp Response));
Headers responseHeaders = okHttpResponse.headers();
for (int i = 0, len = responseHeaders.size(); i < len; i++) {
final String name = responseHeaders.name(i), value = responseHeaders
.value(i);
if (name != null) {
response.addHeader(new BasicHeader(name, value));
}
}
return response;
}
private static HttpEntity entityFromOkHttpResponse(Response r)
throws IOException {
BasicHttpEntity entity = new BasicHttpEntity();
ResponseBody body = r.body();
entity.setContent(body.byteStream());
entity.setContentLength(body.contentLength());
entity.setContentEncoding(r.header("Content-Encoding"));
if (body.contentType() != null) {
entity.setContentType(body.contentType().type());
}
return entity;
}
@SuppressWarnings("deprecation")
private static void setConnectionParametersForRequest(
okhttp3.Request.Builder builder, Request<?> request)
throws IOException, AuthFailureError {
switch (request.getMethod()) {
case Request.Method.DEPRECATED_GET_OR_POST:
// Ensure backwards compatibility. Volley assumes a request with a
// null body is a GET.
byte[] postBody = request.getPostBody();
if (postBody != null) {
builder.post(RequestBody.create(
MediaType.parse(request.getPostBodyContentType()),
postBody));
}
break;
case Request.Method.GET:
builder.get();
break;
case Request.Method.DELETE:
builder.delete();
break;
case Request.Method.POST:
builder.post(createRequestBody(request));
break;
case Request.Method.PUT:
builder.put(createRequestBody(request));
break;
case Request.Method.HEAD:
builder.head();
break;
case Request.Method.OPTIONS:
builder.method("OPTIONS", null);
break;
case Request.Method.TRACE:
builder.method("TRACE", null);
break;
case Request.Method.PATCH:
builder.patch(createRequestBody(request));
break;
default:
throw new IllegalStateException("Unknown method type.");
}
}
private static ProtocolVersion parseProtocol(final Protocol p) {
switch (p) {
case HTTP_1_0:
return new ProtocolVersion("HTTP", 1, 0);
case HTTP_1_1:
return new ProtocolVersion("HTTP", 1, 1);
case SPDY_3:
return new ProtocolVersion("SPDY", 3, 1);
case HTTP_2:
return new ProtocolVersion("HTTP", 2, 0);
}
throw new IllegalAccessError("Unkwown protocol");
}
private static RequestBody createRequestBody(Request r)
throws AuthFailureError {
if (r instanceof JsonRequest || r instanceof StringRequest) {
final byte[] body = r.getBody();
if (body == null)
return null;
return RequestBody
.create(MediaType.parse(r.getBodyContentType()), body);
} else if (r instanceof MultiPartRequest) {
MultiPartRequest mlpRequest = (MultiPartRequest) r;
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
if (mlpRequest.getMultipartParams() != null && !mlpRequest.getMultipartParams().isEmpty()) {
for (Object key : mlpRequest.getMultipartParams().keySet()) {
MultiPartRequest.MultiPartParam p = (MultiPartRequest.MultiPartParam) mlpRequest.getMultipartParams().get(key);
Log.w("param", key + ":" + p.value);
builder.addFormDataPart(key.toString(), p.value);
}
}
if (mlpRequest.getFilesToUpload() != null && !mlpRequest.getFilesToUpload().isEmpty()) {
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
for (Object key :
mlpRequest.getFilesToUpload().keySet()) {
Log.w("fileParam", key + ":" + mlpRequest.getFilesToUpload().get(key).toString()) ;
File file = new File(mlpRequest.getFilesToUpload().get(key).toStri ng());
builder.addFormDataPart(key.toString(), file.getName(),
RequestBody.create(MEDIA_TYPE_PNG, file));
}
}
return builder.build();
}
return null;
}
}
کلاس MyApplication:
public class MyApplication extends Application {
private static MyApplication mInstance;
private RequestQueue mRequestQueue;
public static OkHttpClient client;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
initOKHTTPClient(this);
}
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
okhttp3.Request originalRequest = chain.request();
String cacheHeaderValue = isOnline() ? "public, max-age=2419200"
: "public, only-if-cached, max-stale=2419200";
okhttp3.Request request = originalRequest.newBuilder().build();
Response response = chain.proceed(request);
return response.newBuilder().removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", cacheHeaderValue).build();
}
};
public static void initOKHTTPClient(Context context) {
Log.i("ExternalCacheDir", context.getExternalCacheDir() + "");
Cache cache = new Cache(context.getExternalCacheDir(), 1024 * 1024 * 30);
client = new OkHttpClient.Builder().retryOnConnectionFailure(tr ue)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTER CEPTOR)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
// .addNetworkInterceptor(RETRY_INTERCEPTOR)
// .addInterceptor(RETRY_INTERCEPTOR)
.cache(cache).build();
}
public static boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) mInstance.getSystemService(Context.CONNECTIVITY_SE RVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
public static synchronized MyApplication getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext(),
new OkHttpStack(client));
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}