0913Android基础网络技术之Volley

来源:互联网 发布:成都 python兼职 编辑:程序博客网 时间:2024/05/21 09:04

使用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,ErrorListenerStringRequest 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>
0 0
原创粉丝点击