parent
							
								
									ea8f2603a8
								
							
						
					
					
						commit
						0a7e40dfce
					
				| @ -0,0 +1,227 @@ | ||||
| package com.king.app.updater.http; | ||||
| 
 | ||||
| import android.os.AsyncTask; | ||||
| import android.util.Log; | ||||
| 
 | ||||
| import com.king.app.updater.constant.Constants; | ||||
| import com.king.app.updater.util.SSLSocketFactoryUtils; | ||||
| 
 | ||||
| import org.apache.http.conn.ssl.SSLSocketFactory; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.InputStream; | ||||
| import java.net.ConnectException; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import okhttp3.Call; | ||||
| import okhttp3.OkHttpClient; | ||||
| import okhttp3.Request; | ||||
| import okhttp3.Response; | ||||
| 
 | ||||
| /** | ||||
|  * OkHttpManager使用{@link OkHttpClient}实现{@link IHttpManager} | ||||
|  * 使用OkHttpManager时必须依赖OkHttp库 | ||||
|  * @author <a href="mailto:jenly1314@gmail.com">Jenly</a> | ||||
|  */ | ||||
| public class OkHttpManager implements IHttpManager { | ||||
| 
 | ||||
|     private static final int DEFAULT_TIME_OUT = 20000; | ||||
| 
 | ||||
|     private OkHttpClient okHttpClient; | ||||
| 
 | ||||
|     private boolean isCancel; | ||||
| 
 | ||||
|     private static volatile OkHttpManager INSTANCE; | ||||
| 
 | ||||
|     public static OkHttpManager getInstance(){ | ||||
|         if(INSTANCE == null){ | ||||
|             synchronized (HttpManager.class){ | ||||
|                 if(INSTANCE == null){ | ||||
|                     INSTANCE = new OkHttpManager(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return INSTANCE; | ||||
|     } | ||||
| 
 | ||||
|     private OkHttpManager(){ | ||||
|         this(DEFAULT_TIME_OUT); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * HttpManager对外暴露。如果没有特殊需求,推荐使用{@link HttpManager#getInstance()} | ||||
|      * @param timeout 超时时间,单位:毫秒 | ||||
|      */ | ||||
|     public OkHttpManager(int timeout){ | ||||
|         this(new OkHttpClient.Builder() | ||||
|                 .readTimeout(timeout, TimeUnit.MILLISECONDS) | ||||
|                 .connectTimeout(timeout, TimeUnit.MILLISECONDS) | ||||
|                 .sslSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory(),SSLSocketFactoryUtils.createTrustAllManager()) | ||||
|                 .hostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) | ||||
|                 .build()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * HttpManager对外暴露,推荐使用{@link HttpManager#getInstance()} | ||||
|      * @param okHttpClient {@link OkHttpClient} | ||||
|      */ | ||||
|     public OkHttpManager(@NonNull OkHttpClient okHttpClient){ | ||||
|         this.okHttpClient = okHttpClient; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @Override | ||||
|     public void download(String url, final String path, final String filename, @Nullable Map<String, String> requestProperty, final DownloadCallback callback) { | ||||
|         isCancel = false; | ||||
|         new DownloadTask(okHttpClient,url,path,filename,requestProperty,callback).execute(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void cancel() { | ||||
|         isCancel = true; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 异步下载任务 | ||||
|      */ | ||||
|     private class DownloadTask extends AsyncTask<Void,Long, File> { | ||||
|         private String url; | ||||
| 
 | ||||
|         private String path; | ||||
| 
 | ||||
|         private String filename; | ||||
| 
 | ||||
|         private Map<String,String> requestProperty; | ||||
| 
 | ||||
|         private DownloadCallback callback; | ||||
| 
 | ||||
|         private Exception exception; | ||||
| 
 | ||||
|         private OkHttpClient okHttpClient; | ||||
| 
 | ||||
|         public DownloadTask(OkHttpClient okHttpClient,String url, String path, String filename ,@Nullable Map<String,String> requestProperty, DownloadCallback callback){ | ||||
|             this.okHttpClient = okHttpClient; | ||||
|             this.url = url; | ||||
|             this.path = path; | ||||
|             this.filename = filename; | ||||
|             this.callback = callback; | ||||
|             this.requestProperty = requestProperty; | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected File doInBackground(Void... voids) { | ||||
| 
 | ||||
|             try{ | ||||
|                 Request.Builder builder = new Request.Builder() | ||||
|                         .url(url) | ||||
|                         .addHeader("Accept-Encoding", "identity") | ||||
|                         .get(); | ||||
| 
 | ||||
|                 if(requestProperty!=null){ | ||||
|                     for(Map.Entry<String,String> entry : requestProperty.entrySet()){ | ||||
|                         builder.addHeader(entry.getKey(),entry.getValue()); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 Call call = okHttpClient.newCall(builder.build()); | ||||
|                 Response response = call.execute(); | ||||
| 
 | ||||
|                 if(response.isSuccessful()){ | ||||
|                     InputStream is = response.body().byteStream(); | ||||
| 
 | ||||
|                     long length = response.body().contentLength(); | ||||
| 
 | ||||
|                     Log.d(Constants.TAG,"contentLength:" + length); | ||||
| 
 | ||||
|                     long progress = 0; | ||||
| 
 | ||||
|                     byte[] buffer = new byte[8192]; | ||||
| 
 | ||||
|                     int len; | ||||
|                     File file = new File(path,filename); | ||||
|                     FileOutputStream fos = new FileOutputStream(file); | ||||
|                     while ((len = is.read(buffer)) != -1){ | ||||
|                         if(isCancel){ | ||||
|                             if(call != null){ | ||||
|                                 call.cancel(); | ||||
|                             } | ||||
|                             cancel(true); | ||||
|                             break; | ||||
|                         } | ||||
|                         fos.write(buffer,0,len); | ||||
|                         progress += len; | ||||
|                         //更新进度
 | ||||
|                         if(length>0){ | ||||
|                             publishProgress(progress,length); | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     fos.flush(); | ||||
|                     fos.close(); | ||||
|                     is.close(); | ||||
| 
 | ||||
|                     response.close(); | ||||
| 
 | ||||
|                     return file; | ||||
| 
 | ||||
|                 }else {//连接失败
 | ||||
|                     throw new ConnectException(String.format("responseCode = %d",response.code())); | ||||
|                 } | ||||
| 
 | ||||
|             }catch (Exception e){ | ||||
|                 this.exception = e; | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
| 
 | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected void onPreExecute() { | ||||
|             super.onPreExecute(); | ||||
|             if(callback!=null){ | ||||
|                 callback.onStart(url); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected void onPostExecute(File file) { | ||||
|             super.onPostExecute(file); | ||||
|             if(callback!=null){ | ||||
|                 if(file!=null){ | ||||
|                     callback.onFinish(file); | ||||
|                 }else{ | ||||
|                     callback.onError(exception); | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected void onProgressUpdate(Long... values) { | ||||
|             super.onProgressUpdate(values); | ||||
|             if(callback!=null){ | ||||
|                 if(!isCancelled()){ | ||||
|                     callback.onProgress(values[0],values[1]); | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected void onCancelled() { | ||||
|             super.onCancelled(); | ||||
|             if(callback!=null){ | ||||
|                 callback.onCancel(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
									
										Binary file not shown.
									
								
							
						| @ -1 +1 @@ | ||||
| [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":8,"versionName":"1.0.5-androidx","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] | ||||
| [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":10,"versionName":"1.0.6-androidx","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] | ||||
					Loading…
					
					
				
		Reference in new issue