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 MultipartBuilder()
            .type(MultipartBuilder.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());
              }
            });
  }