在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"/>

运行效果图:

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

更多相关文章

  1. android 如何使用SAX解析XML
  2. 深入Android的消息机制源码详解~Handler,MessageQueue与Looper关
  3. Android热修复框架AndFix核心代码分析并改进
  4. Android安全框架:Verfied boot -- Secure Boot
  5. Android中利用Handler实现消息的分发机制(三)
  6. Android(安卓)Paging Library 基于RecyclerView的分页加载框架
  7. Android应用盈利广告平台的嵌入方法详解
  8. Android(安卓)自定义音乐播放器实现
  9. android每日一问1【2011-09-06】

随机推荐

  1. C语言
  2. 扎心一问:前后端分离开发,RESTful 接口要怎
  3. C语言学习第八天【函数递归】
  4. 2021-03-06:go中,公共变量是协程安全吗?赋值
  5. SCCM OSD部署操作系统在应用操作系统步骤
  6. 阿里问题定位神器 Arthas 的骚操作,定位线
  7. 有了这 4 款工具,老板再也不怕我写烂SQL了
  8. 面试官:说说你之前负责的系统,QPS 能达到多
  9. 为什么阿里代码规范要求SQL语句不要过多
  10. 太方便了!IntelliJ IDEA 中如何直接使用 G