Android使用AsyncHttpClient上传多个文件

在Android开发中,网络请求的方式有很多,如果运用httpclient自定义的话,代码很多,而且不容易理解。当然,自定义请求可以帮助你更好的深入理解底层源码。但在实战开发中并不适用。
在Android中一般比较常见的网络请求框架大致有:
1.Volley框架:它是谷歌在2013年推出的网络请求框架,他适用于数据比较简单,但请求比较频繁的操作,也就是说,他的并发性很好,但是在大型的文件或数据交互时就会很糟糕。
2.okhttp框架:在开发的过程中,它还是非常高效的,它适用于android2.3以上。
3.xutils:缓存网络请求数据。
4.android-async-http框架:在该框架中,核心的类就是AsyncHttpClient,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。
当然,还有很多网络请求的框架,我在这里就不一一列举出来了。下面是我再开发过程中运用到的一段关于异步上传图片或视频文件的资料,希望对大家有所帮助。

首先要导入架包:
这里写图片描述

完成架包的导入后代码如下:

package com.wujie.uploadfile;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.wujie.config.Configtest;
import com.wujie.volleyall.R;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class UploadFileActivity extends Activity{
    private Button upload;
    private TextView pro;
    ProgressDialog ProgressDialo;//监控上传文件进度
     int count;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.uploadfile);

        //初始化数据
        upload=(Button) findViewById(R.id.upload_btn);
        pro=(TextView) findViewById(R.id.upload_tv);
        upload.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                try {

                    postFile();//上传文件
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
            }
        });




    }

/** 
 * 上传多个文件
 * @throws Exception
 */
    public void postFile() throws Exception{

        String path ="sdcard/Download/cache_files/kabuka_201.apk";
        String path2 ="sdcard/DCIM/mm.jpg";
        File file = new File(path);
        File file2 = new File(path2);
        if(file.exists() && file.length()>0){
            System.out.println("文件找到!");
        //创建异步请求对象
          AsyncHttpClient client = new AsyncHttpClient();
         //将要上传的文件放入RequestParams对象中
          RequestParams params = new RequestParams();
          params.put("file1", file);
          params.put("file2", file2);
          params.put("content", "wujie");
         //发起post请求
          client.post(Configtest.WUJIELOADURL, params,new AsyncHttpResponseHandler() {
          //上传失败监听方法      
            @Override
            public void onFailure(int arg0, Header[] arg1, byte[] arg2,
                    Throwable arg3) {
                // TODO Auto-generated method stub
                 Toast.makeText(UploadFileActivity.this, "失败", Toast.LENGTH_LONG).show();
            }
             //上传成功监听方法
            @Override
            public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
                // TODO Auto-generated method stub
                Toast.makeText(UploadFileActivity.this, "成功", Toast.LENGTH_LONG).show();
            }
             //上传过程中的进度
            @Override  
            public void onProgress(int bytesWritten, int totalSize) {  
                // TODO Auto-generated method stub  
                super.onProgress(bytesWritten, totalSize);  
                 count = (int) ((bytesWritten * 1.0 / totalSize) * 100);          
                Log.i("上传 Progress>>>>>", count + " / ");       
            } 

             @Override  
                public void onRetry(int retryNo) {  
                    // TODO Auto-generated method stub  
                    super.onRetry(retryNo);  
                    // 返回重试次数  
                }  
          });
        }else{
          Toast.makeText(UploadFileActivity.this, "文件不存在", 1).show();
        }    
     }  
}

因为是上传文件,所以少不了以下权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

运行效果图:
Android使用AsyncHttpClient上传多个文件_第1张图片
Android使用AsyncHttpClient上传多个文件_第2张图片

在上面代码中没有写出上传文件的进度条,后期会慢慢完善。

你可能感兴趣的:(android)