使用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>