網絡請求與json數據解析——學習筆記

坑啊,無法保存到草稿箱,還得重新寫一遍還好沒有一次性寫完。

——————正文———————

Volley非常適合數據量小,通信頻繁的網絡操作,如果是數據量大的,像音頻,視頻等的傳輸,還是不要使用Volley的爲好。使用Volley前,先添加依賴:

compile 'com.mcxiaoke.volley:library:1.0.19'

然後是網絡請求權限:

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

權限千萬別忘了寫!!!
Volley請求網絡大概步驟就是,先創建一個請求隊列,然後開始獲取一個請求,接着把這個請求添加到請求隊列即可。
以下是Volley的一個簡單實例,寫在一個方法中

//使用volley請求數據
    public void getDataFromeNet(){
        RequestQueue queue = Volley.newRequestQueue(context); //請求隊列

        //獲取請求
        StringRequest request = new StringRequest(Request.Method.GET, Constants.NEWS_TOP_URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                LogUtil.e("使用Volley聯網請求數據成功——" + response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                LogUtil.e("使用Volley聯網請求數據失敗——" + error.getMessage());
            }
        }){
            //解決亂碼
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                try {
                    String parsed = new String(response.data, "UTF-8");
                    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                return super.parseNetworkResponse(response);
            }
        };
        queue.add(request); //添加請求
    }

上面的代碼還在StringRequest(){}中重寫了parseNetworkResponse方法,目的是爲了防止之後解析的數據出現亂碼的情況,方法使用成功後會打印如下日誌:
這裏寫圖片描述
表示聯網請求成功了。
不過同時不要文件在請求失敗的方法onErrorResponse中也寫上打印日誌,這樣方便找出錯誤。

上面的方法用xUtils3也能夠實現,xUtils3是一個聚合類框架,能做很多事情,具體介紹可以看https://github.com/wyouflf/xUtils3
然後在使用xUtils3之前,首先要添加依賴:

compile 'org.xutils:xutils:3.5.0'

接着需要初始化才能正常使用,方法就是在一個Application的onCreate中添加初始化,比如我創建一個MainApplication並讓其繼承Application,然後在它的onCreate方法中初始化:

// 在application的onCreate中初始化
@Override
public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(BuildConfig.DEBUG); // 是否輸出debug日誌, 開啓debug會影響性能.
    ...
}

同時,千萬別忘記了,要把這個Application添加到AndroidManifest.xml的application中!
接下來就是實現和之前Volley一樣的效果,具體代碼如下:

//使用xUtils3聯網情i去數據
    public void getDataFromNet() {
        RequestParams params = new RequestParams(Constants.NEWS_CENTER_PAGER_URL);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                LogUtils.e("使用xUtils3聯網請求——成功 —— " + result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                LogUtils.e("使用xUtils3聯網請求——失敗 —— " + ex.getMessage());

            }

            @Override
            public void onCancelled(CancelledException cex) {
                LogUtils.e("使用xUtils3聯網——取消 —— " + cex.getMessage());

            }

            @Override
            public void onFinished() {
                LogUtils.e("使用xUtils3聯網請求——完成 ");
            }
        });
    }

效果基本上一致,就不貼圖了,接下來就是解析Json數據了!

爲了方便一點,就先使用Gson來解析Json數據吧,使用Gson之前,首先添加依賴:

compile 'com.google.code.gson:gson:2.7'

然後寫一個解析json數據的方法

//使用Gson解析數據
    private NewsTopBeanAuto parsedJsonWithGson(String json) {
//        Gson gson = new Gson();
//        NewsTopBean bean = gson.fromJson(json, NewsTopBean.class);
//        retrun bean;
        return new Gson().fromJson(json, NewsTopBeanAuto.class);
    }

這裏解析數據有兩種寫法,第一種比第二種代碼更長可讀性更好,第二種可讀性差不過簡潔,取捨因人而異吧,推薦用第一種!還有就是NewsTopBeanAuto類是使用GsonFormat工具自動生成的,使用這個工具需要先在Plugins中下載,然後粘貼上由鏈接返回的數據生成代碼,具體就不說了。可以看一下這個自動生成的類,其中有一些改動,不過建議這個類還是手動寫的好,至於API嘛,就是在網上找的新聞API.

數據解析完成後,就來獲取其中的內容,於是又寫一個方法,順便加一個打印日誌,用來獲取一條新聞的標題:

    //解析數據並且顯示數據
    private void processData(String json){
        NewsTopBeanAuto bean = parsedJsonWithGson(json);
        String title = bean.getResult().getResult().getList().get(0).getTitle();
        LogUtil.e("使用Gson解析json數據成功——" + title);
    }

然後調用上面這個方法,即可獲得數據,下面是整個的代碼,代碼和前面幾篇文章都是一脈相承的哦:

public class NewsPager extends BasePager {
    public NewsPager(Context context) {
        super(context);
    }

    @Override
    public void initData() {
        super.initData();
        title_text.setText("新聞");

        TextView textView = new TextView(context);
        textView.setText("我是新聞頁面");
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(30);
        textView.setTextColor(Color.RED);

        base_content_fl.addView(textView);//添加視圖

        getDataFromeNet();
    }

    //使用volley請求數據
    public void getDataFromeNet(){
        RequestQueue queue = Volley.newRequestQueue(context);


        StringRequest request = new StringRequest(Request.Method.GET, Constants.NEWS_TOP_URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                LogUtil.e("使用Volley聯網請求數據成功——" + response);
                processData(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                LogUtil.e("使用Volley聯網請求數據失敗——" + error.getMessage());
            }
        }){
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                try {
                    String parsed = new String(response.data, "UTF-8");
                    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                return super.parseNetworkResponse(response);
            }
        };
        queue.add(request);
    }

    //解析數據並且顯示數據
    private void processData(String json){
        NewsTopBeanAuto bean = parsedJsonWithGson(json);
        String title = bean.getResult().getResult().getList().get(0).getTitle();
        LogUtil.e("使用Gson解析json數據成功——" + title);
    }

    //使用Gson解析數據
    private NewsTopBeanAuto parsedJsonWithGson(String json) {
//        Gson gson = new Gson();
//        NewsTopBean bean = gson.fromJson(json, NewsTopBean.class);
        return new Gson().fromJson(json, NewsTopBeanAuto.class);
    }

}

然後看一下打印的日誌:
這裏寫圖片描述
請求成功了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章