先貼上MainActivity.javaphp
package cn.edu.zafu.sample; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; import okhttp3.Callback; import okhttp3.Headers; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import cn.edu.zafu.coreprogress.helper.ProgressHelper; import cn.edu.zafu.coreprogress.listener.ProgressListener; import cn.edu.zafu.coreprogress.listener.impl.UIProgressListener; public class MainActivity extends AppCompatActivity { private static final OkHttpClient client = new OkHttpClient.Builder() //設置超時,不設置可能會報異常 .connectTimeout(1000, TimeUnit.MINUTES) .readTimeout(1000, TimeUnit.MINUTES) .writeTimeout(1000, TimeUnit.MINUTES) .build(); private Button upload,download; private ProgressBar uploadProgress,downloadProgeress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { uploadProgress= (ProgressBar) findViewById(R.id.upload_progress); downloadProgeress= (ProgressBar) findViewById(R.id.download_progress); upload= (Button) findViewById(R.id.upload); download= (Button) findViewById(R.id.download); upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { upload(); } }); download.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { download(); } }); } private void download() { //這個是非ui線程回調,不可直接操做UI final ProgressListener progressResponseListener = new ProgressListener() { @Override public void onProgress(long bytesRead, long contentLength, boolean done) { Log.e("TAG", "bytesRead:" + bytesRead); Log.e("TAG", "contentLength:" + contentLength); Log.e("TAG", "done:" + done); if (contentLength != -1) { //長度未知的狀況下回返回-1 Log.e("TAG", (100 * bytesRead) / contentLength + "% done"); } Log.e("TAG", "================================"); } }; //這個是ui線程回調,可直接操做UI final UIProgressListener uiProgressResponseListener = new UIProgressListener() { @Override public void onUIProgress(long bytesRead, long contentLength, boolean done) { Log.e("TAG", "bytesRead:" + bytesRead); Log.e("TAG", "contentLength:" + contentLength); Log.e("TAG", "done:" + done); if (contentLength != -1) { //長度未知的狀況下回返回-1 Log.e("TAG", (100 * bytesRead) / contentLength + "% done"); } Log.e("TAG", "================================"); //ui層回調 downloadProgeress.setProgress((int) ((100 * bytesRead) / contentLength)); //Toast.makeText(getApplicationContext(), bytesRead + " " + contentLength + " " + done, Toast.LENGTH_LONG).show(); } @Override public void onUIStart(long bytesRead, long contentLength, boolean done) { super.onUIStart(bytesRead, contentLength, done); Toast.makeText(getApplicationContext(),"start",Toast.LENGTH_SHORT).show(); } @Override public void onUIFinish(long bytesRead, long contentLength, boolean done) { super.onUIFinish(bytesRead, contentLength, done); Toast.makeText(getApplicationContext(),"end",Toast.LENGTH_SHORT).show(); } }; //構造請求 final Request request1 = new Request.Builder() .url("http://121.41.119.107:81/test/1.doc") .build(); //包裝Response使其支持進度回調 ProgressHelper.addProgressResponseListener(client, uiProgressResponseListener).newCall(request1).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { Log.e("TAG", "error ", e); } @Override public void onResponse(Response response) throws IOException { Log.e("TAG", response.body().string()); } }); } private void upload() { File file = new File("/sdcard/1.doc"); //此文件必須在手機上存在,實際狀況下請自行修改,這個目錄下的文件只是在我手機中存在。 //這個是非ui線程回調,不可直接操做UI final ProgressListener progressListener = new ProgressListener() { @Override public void onProgress(long bytesWrite, long contentLength, boolean done) { Log.e("TAG", "bytesWrite:" + bytesWrite); Log.e("TAG", "contentLength" + contentLength); Log.e("TAG", (100 * bytesWrite) / contentLength + " % done "); Log.e("TAG", "done:" + done); Log.e("TAG", "================================"); } }; //這個是ui線程回調,可直接操做UI final UIProgressListener uiProgressRequestListener = new UIProgressListener() { @Override public void onUIProgress(long bytesWrite, long contentLength, boolean done) { Log.e("TAG", "bytesWrite:" + bytesWrite); Log.e("TAG", "contentLength" + contentLength); Log.e("TAG", (100 * bytesWrite) / contentLength + " % done "); Log.e("TAG", "done:" + done); Log.e("TAG", "================================"); //ui層回調 uploadProgress.setProgress((int) ((100 * bytesWrite) / contentLength)); //Toast.makeText(getApplicationContext(), bytesWrite + " " + contentLength + " " + done, Toast.LENGTH_LONG).show(); } @Override public void onUIStart(long bytesWrite, long contentLength, boolean done) { super.onUIStart(bytesWrite, contentLength, done); Toast.makeText(getApplicationContext(),"start",Toast.LENGTH_SHORT).show(); } @Override public void onUIFinish(long bytesWrite, long contentLength, boolean done) { super.onUIFinish(bytesWrite, contentLength, done); Toast.makeText(getApplicationContext(),"end",Toast.LENGTH_SHORT).show(); } }; //構造上傳請求,相似web表單 RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("hello", "android") .addFormDataPart("photo", file.getName(), RequestBody.create(null, file)) .addPart(Headers.of("Content-Disposition", "form-data; name=\"another\";filename=\"another.dex\""), RequestBody.create(MediaType.parse("application/octet-stream"), file)) .build(); //進行包裝,使其支持進度回調 final Request request = new Request.Builder().url("http://121.41.119.107:81/test/result.php").post(ProgressHelper.addProgressRequestListener(requestBody, uiProgressRequestListener)).build(); //開始請求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { Log.e("TAG", "error ", e); } @Override public void onResponse(Response response) throws IOException { Log.e("TAG", response.body().string()); } }); } }
緊接着就是佈局文件了java
layout_main.xmlandroid
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ProgressBar android:id="@+id/upload_progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="0" /> <Button android:id="@+id/upload" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Upload"/> <ProgressBar android:id="@+id/download_progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="0" /> <Button android:id="@+id/download" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Download"/> </LinearLayout>
另外別忘了給配置清單文件添加權限git
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
還有一個就是添加依賴了github
dependencies { compile 'cn.edu.zafu:coreprogress:0.0.3' }
如下問題須要添加web
packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/dependencies.txt' exclude 'META-INF/LGPL2.1' }
源代碼地址:https://github.com/newcaoguo/CoreProgress.gitapp