坑啊,無法保存到草稿箱,還得重新寫一遍還好沒有一次性寫完。
——————正文———————
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);
}
}
然後看一下打印的日誌:
請求成功了!