0913Android基础网络技术之Volley

使用volley访问网络  

Volley工作原理简介

  Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。
  主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。
  下图中,蓝色部分代表主线程,绿色部分代表缓存线程,橙色部分代表网络线程。我们在主线程中调用RequestQueue的add()方法来添加一条网络请求,这条请求会先被加入到缓存队列当中,如果发现可以找到相应的缓存结果就直接读取缓存并解析,然后回调给主线程。如果在缓存中没有找到结果,则将这条请求加入到网络请求队列中,然后处理发送HTTP请求,解析响应结果,写入缓存,并回调主线程。
  
这里写图片描述

Volley使用

  导包,右键点击module选中openModuleSetting,选中当前module,在上侧横栏中选中Denpendencies,点击+号,选中Library dependency,查找volley找到这个包添加进来
这里写图片描述
  
  添加的包
  
这里写图片描述

  添加权限

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

  使用方法:

  • 创建一个RequestQueue对象(一般是新建一个类将其单例化)
  • 创建一个RequestQueue对象
  • .将StringRequest对象添加到RequestQueue里面
      
      单例RequestQueue,设置成单例后就不必每次新创一个消息队列了(如果没有的话则新建一个),节省资源
public class MMySingleton {
    private RequestQueue requestQueue;
    private static MMySingleton mMySingleton;
    private MMySingleton(Context context){
        requestQueue= Volley.newRequestQueue(context);
    }
    public synchronized static MMySingleton getInstance(Context context){
        if(mMySingleton==null){
            mMySingleton=new MMySingleton(context);
        }
        return mMySingleton;
    }

    public RequestQueue getRequestQueue() {
        return requestQueue;
    }
} 

  创建一个RequestQueue对象

//get
//创建一个StringRequest的get对象。四个参数,get/post方法,url,Listener,ErrorListener
StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                mTvVolley.setText(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                mTvVolley.setText("网络连接错误");
            }
        });

//post
//创建一个StringRequest的post对象,比get多一个params的参数
StringRequest stringRequest=new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                mTvVolley.setText(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                mTvVolley.setText("网络连接错误");
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> map=new HashMap<>();
                map.put("username","VolleyPost");
                map.put("password","666666");
                return map;
            }
        };

  将StringRequest对象添加到RequestQueue里面

 MMySingleton.getInstance(getApplicationContext()).getRequestQueue().add(stringRequest)

  实现效果
这里写图片描述

这里写图片描述

NetWorkImageViEW(暂不说明)

  它使用的单例

package com.example.laowang.myinternet;

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;
    }

}

  在活动中调用

 mNetworkImageView.setImageUrl("http://www.daxueit.com/upload/201408/13/101047281001237.png", MySingleton.getInstance(this).getImageLoader());

  达到的效果
这里写图片描述
  

全部代码

  单例在上文中完整出现过,不再说明。
  活动

package com.example.laowang.myinternet;

import android.app.Activity;
import android.os.Bundle;
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 java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2015/9/14.
 */
public class MyVolleyActivity extends Activity implements View.OnClickListener{
    private Button mBtnVolleyGet;
    private TextView mTvVolley;
    private Button mBtnNetImageView;
    private Button mBtnVolleyPost;
    private NetworkImageView mNetworkImageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_volley);

        mBtnVolleyGet = (Button) findViewById(R.id.btn_volley_get);
        mTvVolley= (TextView) findViewById(R.id.tv_volley);
        mNetworkImageView= (NetworkImageView) findViewById(R.id.networkimageview);
        mBtnNetImageView= (Button) findViewById(R.id.btn_img);
        mBtnVolleyPost= (Button) findViewById(R.id.btn_volley_post);

        mBtnVolleyGet.setOnClickListener(this);
        mBtnNetImageView.setOnClickListener(this);
        mBtnVolleyPost.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_volley_get:
                volleyGet();
                break;
            case R.id.btn_volley_post:
                volleyPost();
                break;
            case R.id.btn_img:
                mNetworkImageView.setImageUrl("http://www.daxueit.com/upload/201408/13/101047281001237.png", MySingleton.getInstance(this).getImageLoader());
                break;
            default:
                break;
        }
    }

    private void volleyPost() {
        String url="http://192.168.0.44:8080/MyServiceTest/MyTestServlet";
//                String url="http://www.baidu.com";
//                创建一个RequestQueue对象。
//        RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext());
//                创建一个StringRequest对象。四个参数,get/post方法,url,Listener,ErrorListener
        StringRequest stringRequest=new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                mTvVolley.setText(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                mTvVolley.setText("网络连接错误");
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> map=new HashMap<>();
                map.put("username","VolleyPost");
                map.put("password","666666");
                return map;
            }
        };
//                将StringRequest对象添加到RequestQueue里面。
//        requestQueue.add(stringRequest);
//        api中的单例
//        MySingleton.getInstance(this).addToRequestQueue(stringRequest);
//        自己写的单例
        MMySingleton.getInstance(getApplicationContext()).getRequestQueue().add(stringRequest);
    }

    private void volleyGet() {
        String url="http://192.168.0.44:8080/MyServiceTest/MyTestServlet?username=VolleyGet&password=123456";
//                String url="http://www.baidu.com";
//                创建一个RequestQueue对象。
//        RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext());
//                创建一个StringRequest对象。四个参数,get/post方法,url,Listener,ErrorListener
        StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                mTvVolley.setText(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                mTvVolley.setText("网络连接错误");
            }
        });
//                将StringRequest对象添加到RequestQueue里面。
//        requestQueue.add(stringRequest);
//        api中的单例
//        MySingleton.getInstance(this).addToRequestQueue(stringRequest);
//        自己写的单例
        MMySingleton.getInstance(getApplicationContext()).getRequestQueue().add(stringRequest);
    }
}

  布局

<?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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:gravity="center"
        android:orientation="vertical">


        <TextView
            android:id="@+id/tv_volley"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/btn_volley_get"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="VolleyGet" />
        <Button
            android:id="@+id/btn_volley_post"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="VolleyPost" />

        <Button
            android:id="@+id/btn_img"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="NetworkImageView" />

        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/networkimageview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />


    </LinearLayout>
</ScrollView>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值