android中volley的應用

nwqw9564 8年前發布 | 8K 次閱讀 Android開發 移動開發

來自: http://blog.csdn.net//chenguang79/article/details/44256981


        Volley可說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖片。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目標就是非常適合去進行數據量不大,但通信頻繁的網絡操作,而對于大數據量的網絡操作,比如說下載文件等,Volley的表現就會非常糟糕。

        這里我用一個例子來演示一下,volley在ListView中的使用,并且listVIew中有圖片加載。

       主頁面布局:activity_volley_json_image_test.xml

      

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lv_volley"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"></ListView>
    <TextView
        android:id="@+id/txt_info"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="數據加載中......"
        android:textSize="18sp"
        android:gravity="center"
        android:visibility="gone"/>
</LinearLayout>

    ListView中item的布局
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/img_pic"
        android:layout_width="100dp"
        android:layout_height="100dp" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:orientation="vertical"
        android:layout_marginLeft="5dp">
        <TextView
            android:id="@+id/txt_title"
            android:layout_width="wrap_content"
            android:layout_height="49dp"
            android:text="這是標題"
            android:gravity="center_vertical"/>
        <TextView
            android:id="@+id/txt_time"
            android:layout_width="wrap_content"
            android:layout_height="49dp"
            android:text="2015-03-12"
            android:gravity="center_vertical"/>
    </LinearLayout>
</LinearLayout>

程序代碼:Volley_Json_image_test
package com.example.cg.fangduo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.TextView;

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.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


public class Volley_Json_image_test extends Activity {

    //定義listview
    private ListView lv_volley;
    //定義提示暫無數據
    private TextView txt_info;

    //定義volley請求
    public  RequestQueue  mQueue;

    //定義數據
    public List<Map<String, Object>> info;

    //定義列表的Adapter;
    public Volley_Json_image_Adapter volleyAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_volley__json_image_test);

        initView();
    }

    /**
     * 初始化控件與信息
     */
    private void initView()
    {
        //初始化listview,初始時,因為數據從遠程加載,所以在數據加載未完時,將listview設置為不可見
        lv_volley = (ListView)this.findViewById(R.id.lv_volley);
        lv_volley.setOnScrollListener(new ScrollListener());
        lv_volley.setVisibility(View.GONE);
        //初始化暫無數據,因為數據從遠程加載,所以數據加載中的提示顯示
        txt_info = (TextView)this.findViewById(R.id.txt_info);
        txt_info.setVisibility(View.VISIBLE);

        //初始化volley請求
        mQueue = Volley.newRequestQueue(this);
        //加載數據
        // [{"notepic":"http://image.baidu.com/i?ct=503316480&tn=baiduimagedetail&statnum=girl&ipn=d&z=0&fr=ala&s=0&ic=0&lm=-1&itg=0&cg=girl&word=%E7%BE%8E%E5%A5%B3%E5%9B%BE%E7%89%87&ie=utf-8&in=3354&cl=2&st=&pn=6&rn=1&di=&ln=31000&&fmq=1378374347070_R&se=&sme=0&tab=&face=&&is=0,132526&cs=0,0&adpicid=0&pi=14147590090&os=0&istype=&ist=&jit=&objurl=http%3A%2F%2Fc.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F377adab44aed2e7341c3f0578401a18b87d6faa7.jpg","noteTypeid":1,"noteid":1,"noteFast":0,"noteTitle":"歡迎來到這個神奇的世界","noteDateTime":"2014-7-6"},
        // {"notepic":"http://img3.imgtn.bdimg.com/it/u=2638575563,3145336706&fm=23&gp=0.jpg","noteTypeid":1,"noteid":2,"noteFast":0,"noteTitle":"今天好忙","noteDateTime":"2014-8-17"},
        // {"notepic":"http://img1.imgtn.bdimg.com/it/u=2816850553,3679993090&fm=23&gp=0.jpg","noteTypeid":1,"noteid":3,"noteFast":0,"noteTitle":"不想加班","noteDateTime":"2014-8-17"},
        // {"notepic":"http://img4.imgtn.bdimg.com/it/u=793795634,3401984036&fm=23&gp=0.jpg","noteTypeid":1,"noteid":4,"noteFast":0,"noteTitle":"美女圖1","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img4.imgtn.bdimg.com/it/u=2978660446,2856475006&fm=23&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖2","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img5.imgtn.bdimg.com/it/u=1111035714,1878413225&fm=23&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖3","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img1.imgtn.bdimg.com/it/u=3981637234,1431600967&fm=23&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖4","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img3.imgtn.bdimg.com/it/u=1471976729,3245530376&fm=23&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖5","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img1.imgtn.bdimg.com/it/u=992411909,4001832108&fm=23&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖6","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img3.imgtn.bdimg.com/it/u=1438096542,2010064131&fm=23&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖7","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img1.imgtn.bdimg.com/it/u=2348235091,3744783718&fm=21&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖8","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img3.imgtn.bdimg.com/it/u=486736756,3902182809&fm=21&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖9","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img2.imgtn.bdimg.com/it/u=2671166332,507275986&fm=21&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖10","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img5.imgtn.bdimg.com/it/u=1857438318,1706082473&fm=21&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖11","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img0.imgtn.bdimg.com/it/u=547181070,2589863976&fm=21&gp=0.jpg","noteTypeid":1,"noteid":5,"noteFast":0,"noteTitle":"美女圖12","noteDateTime":"2014-8-29"},
        // {"notepic":"http://img4.imgtn.bdimg.com/it/u=1319733707,1742255567&fm=11&gp=0.jpg","noteTypeid":1,"noteid":6,"noteFast":0,"noteTitle":"美女圖13","noteDateTime":"2014-8-29"}]
        StringRequest jsonRequest = new StringRequest(Request.Method.GET,"http://172.31.0.163:9090/VolleyData.ashx?flag=1",
                new Response.Listener<String>(){

                    @Override
                    public void onResponse(String jsonObject) {

                        txt_info.setVisibility(View.GONE);
                        lv_volley.setVisibility(View.VISIBLE);
                        Log.v("Volley_Json_image_test:",jsonObject.toString());
                        info = getlistForJson(jsonObject);

                        volleyAdapter = new Volley_Json_image_Adapter(Volley_Json_image_test.this,info);

                        lv_volley.setAdapter(volleyAdapter);
                    }
                },
                new Response.ErrorListener(){

                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Log.e("onErrorResponse:",volleyError.toString());
                    }
                });
        mQueue.add(jsonRequest);
        //mQueue.start();
    }

    /**
     * 定義當ListViwe滾動時觸發的事件
     */
    class ScrollListener implements AbsListView.OnScrollListener
    {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            int lastItemid = lv_volley.getLastVisiblePosition();

            if((lastItemid + 1) == totalItemCount)
            {
                //只有當列表數大于0(或是小于30時,加新數據。這個30是為了不讓他重復加載)
                if(totalItemCount < 30 && totalItemCount > 0) {
                    //加載數據
                    StringRequest jsonRequest2 = new StringRequest(Request.Method.GET, "http://172.31.0.163:9090/VolleyData.ashx?flag=2",
                            new Response.Listener<String>() {

                                @Override
                                public void onResponse(String jsonObject) {
                                    info.addAll(getlistForJson(jsonObject));
                                    volleyAdapter.notifyDataSetChanged();
                                }
                            },
                            new Response.ErrorListener() {

                                @Override
                                public void onErrorResponse(VolleyError volleyError) {
                                    Log.e("onErrorResponse:", volleyError.toString());
                                }
                            });


                     mQueue.add(jsonRequest2);

                }
            }
        }
    }


    /**
     * Json 轉成 Map<>
     * @param jsonStr
     * @return
     */
    public static Map<String, Object> getMapForJson(String jsonStr){
        JSONObject jsonObject ;
        try {
            jsonObject = new JSONObject(jsonStr);

            Iterator<String> keyIter= jsonObject.keys();
            String key;
            Object value ;
            Map<String, Object> valueMap = new HashMap<String, Object>();
            while (keyIter.hasNext()) {
                key = keyIter.next();
                value = jsonObject.get(key);
                valueMap.put(key, value);
            }
            return valueMap;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            //Log.e(HttpClientUtils.TAG, e.toString());
        }
        return null;
    }
    /**
     * Json 轉成 List<Map<>>
     * @param jsonStr
     * @return
     */
    public static List<Map<String, Object>> getlistForJson(String jsonStr){
        List<Map<String, Object>> list = null;
        try {
            JSONArray jsonArray = new JSONArray(jsonStr);
            JSONObject jsonObj ;
            list = new ArrayList<Map<String,Object>>();
            for(int i = 0 ; i < jsonArray.length() ; i ++){
                jsonObj = (JSONObject)jsonArray.get(i);
                list.add(getMapForJson(jsonObj.toString()));
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return list;
    }
}

listView的Adapter的代碼:Volley_Json_image_Adapter
package com.example.cg.fangduo;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

import java.util.List;
import java.util.Map;

/**
 * Created by cg on 2015/3/12.
 */
public class Volley_Json_image_Adapter extends BaseAdapter {

    private LayoutInflater inflater;
    //源數據
    private List<Map<String, Object>> jsonInfo;

    //定義volley
    private RequestQueue mQueue;
    private ImageLoader imageLoader;


    public Volley_Json_image_Adapter(Context context, List<Map<String, Object>> jsonInfo)
    {
        this.jsonInfo = jsonInfo;
        this.inflater = LayoutInflater.from(context);

        mQueue = Volley.newRequestQueue(context);
        imageLoader = new ImageLoader(mQueue,new BitmapCache(){
            @Override
            public Bitmap getBitmap(String s) {
                return null;
            }

            @Override
            public void putBitmap(String s, Bitmap bitmap) {

            }
        });
    }

    @Override
    public int getCount() {
        return jsonInfo.size();
    }

    @Override
    public Object getItem(int position) {
        return jsonInfo.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        VolleyInfo volleyInfo;
        if(convertView==null)
        {
            volleyInfo = new VolleyInfo();

            convertView = inflater.inflate(R.layout.lv_volley_item, null);
            volleyInfo.img_pic = (NetworkImageView)convertView.findViewById(R.id.img_pic);
            volleyInfo.txt_title = (TextView)convertView.findViewById(R.id.txt_title);
            volleyInfo.txt_time = (TextView)convertView.findViewById(R.id.txt_time);

            convertView.setTag(volleyInfo);
        }else
        {
            volleyInfo = (VolleyInfo)convertView.getTag();
        }

        volleyInfo.txt_title.setText(jsonInfo.get(position).get("noteTitle").toString());
        volleyInfo.txt_time.setText(jsonInfo.get(position).get("noteDateTime").toString());
        //為圖片控件加載圖片,采用NetworkImageView控件。
        //第一項是加載圖片控件的默認圖片,一般是圖片加載中,這樣的圖片
        //第二項是當發生錯誤的時候加載的圖片,如網絡圖片路徑不對或是加載失敗的時候顯示的圖片
        //第三項就是加載網絡圖片了
        volleyInfo.img_pic.setDefaultImageResId(R.drawable.noimg);
        volleyInfo.img_pic.setErrorImageResId(R.drawable.a01);
        volleyInfo.img_pic.setImageUrl(jsonInfo.get(position).get("notepic").toString(),imageLoader);
        return convertView;
    }


    public class VolleyInfo
    {
        NetworkImageView img_pic;
        TextView txt_title;
        TextView txt_time;
    }

    /**
     * 對圖片進行防OOM處理
     */
    public class BitmapCache implements ImageLoader.ImageCache{

        private LruCache<String,Bitmap> mCache;

        public BitmapCache(){
            int maxSize = 10*1024*1024;
            mCache = new LruCache<String, Bitmap>(maxSize){
                protected int sizeOf(String key,Bitmap bitmap)
                {
                    return bitmap.getRowBytes() * bitmap.getHeight();
                }
            };
        }

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

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

如果你想對Volley了解的更細一點,請參看:
http://blog.csdn.net/guolin_blog/article/details/17482095

 

 本文由用戶 nwqw9564 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!