1.内容学习自郭霖老师的博客 http://blog.csdn.net/guolin_blog/article/details/17482095
最近刚买了第二行代码~想当初就是第一行代码带我学习android的~
2.首先需要下载一个Volley.jar或者自己打包也行。下载地址郭霖老师博客有~下载之后防到libs目录下,重新开启Android Studio.
3.新建一个class文件,继承自Application,我的命名为GlobalData,要在AndroidManifest.xml文件中声明。在GlobalData中我主要记录一些全局变量,如访问url的前缀,用户id,volley请求队列等。
4.GlobalData文件~
public class GlobalData extends Application {
private String url;
RequestQueue mQueue;
String portrait;
String userId;
int integral;
@Override
public void onCreate() {
super.onCreate();
url = "http://xx.xx.xx.xxx/demo";
mQueue = Volley.newRequestQueue(getApplicationContext());//初始化请求队列
portrait = "";
userId = "";
mQueue.start();//开启volley请求队列
}
public String getUrl() {
return url;
}
public RequestQueue getmQueue() {
return mQueue;
}
public void setPortrait(String portrait) {
this.portrait = portrait;
}
public String getPortrait() {
return this.portrait;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserId() {
return this.userId;
}
public void setIntegral(int integral) {
this.integral = integral;
}
public int getIntegral() {
return this.integral;
}
}
5.在LoginActivity中使用。MyJsonRequest的第一个参数是请求方法,第二个是url ,第三个参数是params,即传递的数据,注意的是,此处提交的为表单格式,想要JSON格式可以使用JsonObjectRequest.
final GlobalData application = (GlobalData) getApplication();
String url = application.getUrl();
RequestQueue mQueue = application.getmQueue();
HashMap<String, String> params = new HashMap<>();
params.put("userId", id);
params.put("userPass", pass);
MyJsonRequest myJsonRequest = new MyJsonRequest(Request.Method.POST, url + "/login", params, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
try {
if (jsonObject.getInt("statusCode") == 200) {
application.setUserId(id);
application.setPortrait(jsonObject.getString("portrait"));
startActivity(new Intent(LoginActivity.this, HomeActivity.class));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i(TAG, "Volley returned error________________:" + volleyError);
Toast.makeText(context, "登录失败", Toast.LENGTH_LONG).show();
}
});
mQueue.add(myJsonRequest);
6.MyJsonRequest文件是从网上一个大神那里找到的~当时时间紧,忘了收藏网址了~
public class MyJsonRequest extends Request<JSONObject> {
private Response.Listener<JSONObject> listener;
private Map<String, String> params;
public MyJsonRequest(String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public MyJsonRequest(int method, String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
}
;
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Charset", "UTF-8");
headers.put("Content-Type", "application/json");
headers.put("Accept-Encoding", "gzip,deflate");
headers.put("apiKey", Constant.APIKEY);
return headers;
}
}
7.根据url加载网络图片,最简单的办法就是new 一个 ImageRequest,添加到VolleyRequestQueue中,但是这个方法是没有缓存处理的。在我做demo的过程中,要加载很多图片,不做缓存的话体验不太好。
LruImageCache lruImageCache;
ImageLoader loader;
lruImageCache = LruImageCache.instance();
loader = new ImageLoader(mQueue, lruImageCache);
private void setNetImage(NetworkImageView pic, String imageUrl) {
if (imageUrl == null) return;
pic.setDefaultImageResId(R.drawable.pic_launcher);
pic.setErrorImageResId(R.drawable.pic_launcher);
pic.setImageUrl(url + imageUrl, loader);
}
在使用的时候setNetImage第一个变量,表示要把图片展示到哪个组件上,imageUrl为图片的路径。在这里我的imageUrl是图片的后缀。
8.LruImageCache
public class LruImageCache implements ImageLoader.ImageCache {
private static LruCache<String, Bitmap> mMemoryCache;
private static LruImageCache lruImageCache;
private LruImageCache(){
// Get the Max available memory
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap){
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
public static LruImageCache instance(){
if(lruImageCache == null){
lruImageCache = new LruImageCache();
}
return lruImageCache;
}
@Override
public Bitmap getBitmap(String arg0) {
return mMemoryCache.get(arg0);
}
@Override
public void putBitmap(String arg0, Bitmap arg1) {
if(getBitmap(arg0) == null){
mMemoryCache.put(arg0, arg1);
}
}
}
9.向服务器传送一张本地图片,将其base64编码为一串字符串。
public static String Bitmap2StrByBase64(Bitmap bit){
ByteArrayOutputStream bos=new ByteArrayOutputStream();
bit.compress(Bitmap.CompressFormat.JPEG, 40, bos);//参数100表示原图
byte[] bytes=bos.toByteArray();
return Base64.encodeToString(bytes, Base64.DEFAULT);
}