Android 网络通信框架Volley

本文介绍了一个结合了AsyncHttpClient和Universal-Image-Loader优点的网络通信框架Volley。它利用线程池实现高效的HTTP通信和图片加载,通过主线程、cache线程及network线程解决并发问题。文章还提供了具体的实现步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Volley的架构设计

Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。

Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。
主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。如下图:
这里写图片描述

原理图:

这里写图片描述

volley例子

效果图:

这里写图片描述
步骤: 1,写一个layout(activity_volley)
2,写一个单例MySingleton
3,写一个VolleyActivity(1. 创建一个RequestQueue对象。

  1. 创建一个StringRequest对象。

  2. 将StringRequest对象添加到RequestQueue里面。)
    4,在AndroidMainfest里添加权限

1,写一个layout
activity_volley
><?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/netImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </com.android.volley.toolbox.NetworkImageView>
        <Button
            android:id="@+id/button_getimage"
            android:text="得到图片"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/button_connect"
            android:text="连接网络"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/textview_volley"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</ScrollView>
2,写一个单例MySingleton
MySingleton.java
package com.example.administrator.networkmode.MyVolley;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
/**
 * Created by Administrator on 2015/9/14.
 */
public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });

    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }

}
3,写一个VolleyActivity(1. 创建一个RequestQueue对象。
  1. 创建一个StringRequest对象。

  2. 将StringRequest对象添加到RequestQueue里面。)

VolleyActivity
package com.example.administrator.networkmode.MyVolley;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.administrator.networkmode.R;

import java.lang.ref.ReferenceQueue;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2015/9/14.
 */
public class VolleyActivity extends AppCompatActivity implements View.OnClickListener {
    private Button mBtVolley;
    private TextView mTextviewVolley;
    private NetworkImageView networkImageView;
    private Button mBtImageLoader;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_volley);
        mBtVolley= (Button) findViewById(R.id.button_connect);
        networkImageView= (NetworkImageView) findViewById(R.id.netImage);
        mBtImageLoader= (Button) findViewById(R.id.button_getimage);
        mTextviewVolley= (TextView) findViewById(R.id.textview_volley);
        mBtVolley.setOnClickListener(this);
        mBtImageLoader.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_getimage:
                networkImageView.setImageUrl("http://www.daxueit.com/upload/201408/13/101047281001237.png",MySingleton.getInstance(this).getImageLoader());
                break;
            case R.id.button_connect:
             //RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。
                RequestQueue queue= Volley.newRequestQueue(getApplicationContext());
                 //这里new出了一个StringRequest对象,StringRequest的构造函数需要传入四个参数,
                // 第一个参数是请求的方法,第二个参数就是目标服务器的URL地址,第三个参数是服务器响应成功的回调,第四个参数是服务器响应失败的回调。
                // 其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里返回一个Toast
                StringRequest request=new StringRequest(Request.Method.POST, "http://192.168.0.30:8080/MyWebTest/MyTestServerlet", new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                          mTextviewVolley.setText(response);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        mTextviewVolley.setText("网络连接错误");
                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        HashMap<String,String> map=new HashMap<>();
                        map.put("username","zhangsan");
                        return map;
                    }
                };
                MySingleton.getInstance(getApplicationContext()).addToRequestQueue(request);
                break;
        }
    }
}
4,在AndroidMainfest里添加权限
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

使用volley前我们需要导入volley的jar包。

eclipse:下载jar包,复制到工程下的libs中即可。
studio:
法1:和eclipse一样把jar包放在libs下
法2:用studio直接下载:右击项目>open moudle settings>在Dependencies中搜索:volley,使用最新的版本,OK即可。
法3:导入源码包:file>右击import module >找到源码包路径>确定。 还需要导入module,在Dependencies>点击+号导入modul

stdio中导包的这种方式,也可以用来导入httpclient包,因为在android6.0中舍弃了httpclient,可以在6.0搜索:org.apache.http导入httpclient包即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值