標籤:
學習內容:
1.使用StringRequest實現擷取伺服器的字串響應...
前幾篇一直都在對服務——響應過程的源碼進行分析,解析了整個過程,那麼Volley中到底實現了哪些請求才是我們在開發中需要進行使用的...Volley實現的東西其實並不是很多,它的主要功能是實現非同步進行網路請求和圖片載入,其實就是非同步載入解析Json資料,非同步擷取伺服器的字串資料,非同步實現網狀圖片的動態載入,還有一個請求就是清空緩衝的請求,不過使用的地方不是很多,主要還是前面三個方面,因此Volley相對於AndBase來說,其實還算是一個輕量級的架構,而AndBase涉及到的東西就更加的廣泛,全面,但是網路請求這一部分使用Volley基本算是夠用了...
1.StringRequest.java
package com.android.volley.toolbox;import com.android.volley.NetworkResponse;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import java.io.UnsupportedEncodingException;public class StringRequest extends Request<String> { private final Listener<String> mListener; //請求成功的監聽... //根據指定的請求方式和url建立一個StringRquest對象... public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) { super(method, url, errorListener); //佈建要求方式,url,以及錯誤監聽.. mListener = listener; //設定成功監聽... } //根據指定的url來建立一個StringRequest對象,請求方式預設為GET.. public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) { this(Method.GET, url, listener, errorListener); } //這裡涉及到發送響應的過程了...表示整個請求的響應已經返回... @Override protected void deliverResponse(String response) { mListener.onResponse(response); } //對響應的解析過程... @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //對響應資料封裝,解析字元集... } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));//返回請求成功... }}
上面只是StringRequest的源碼實現,非常的簡單...那麼我們來具體的看看怎麼用...
一般使用在簡單的回應程式式,返回一些基本的資料資訊,比如說使用者登入中,在發送Post請求發送使用者的帳號資訊和密碼的時候,需要伺服器調取資料庫進行相關尋找...在完成這個響應之後需要為服務端返迴響應資訊,一般就是以字串的形式進行發送的...
package com.example.oop;import com.android.volley.RequestQueue;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.ImageLoader.ImageCache;import com.android.volley.toolbox.NetworkImageView;import com.android.volley.toolbox.Volley;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.support.v4.util.LruCache;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;public class MainActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } public void init(){ RequestQueue queue=Volley.newRequestQueue(MainActivity.this); //首先建立一個請求隊列... //然後需要向請求隊列中添加相關請求... queue.add(new StringRequest("http://www.baidu.com/",new Listener <StringRequest>(){ //請求成功,接收要求方法的重寫... @Override public void onResponse(String response){ System.out.println(response.toString()); } },new ErrorListener(){ //請求失敗,對錯誤的擷取... @Override public void onErrorResponse(VolleyError error){ System.out.println(error.toString()); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}
這裡我們想百度頁面發送了相關的請求,那麼毫無疑問,請求成功是必然的,那麼返回的東西就是百度頁面的原生資料,其實就是Html頁面代碼...那麼我們無法去解析這個頁面,但是瀏覽器卻是可以的,我們可以通過瀏覽器去載入這個頁面...這隻是一個簡單的小例子而已,目的是我們需要清楚,伺服器返回給我們的是什麼資料...
第二個例子:
這是一個中間用於過程處理的JSP方法...用於處理賬戶和密碼,只是一個簡單的方式,我們當然也可以通過它去串連資料庫,完善化這個函數...這裡只是一個簡單的小例子...
<% String name=request.getParameter("name"); String password=request.getParameter("password"); if("darker".equals(name)&& "49681888".equals(password)){ out.println("Receive name is:"+name); out.println("Receive password is:"+password);%> Your Message are right! <%}else{ out.println("Receive name is:"+name); out.println("Receive password is:"+password);%> Your Message are wrong! <%}%>
那麼Activity中需要通過Post請求發送請求參數,才能夠通過這個函數來進行下一步的判斷...由於Post請求中沒有傳遞參數的方法...但是我們可以通過重寫getParam()方法...來指定相關參數,服務端會自動調用getParam()中的參數....
package com.example.oop;//有一部分包沒有引用,在編寫的時候會自動引用的...import com.android.volley.RequestQueue;import com.android.volley.toolbox.Volley;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;public class MainActivity extends Activity { TextView tv; String url="192.168.19.172:8080/JSP/post.jsp" @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv=(TextView)findViewById(R.id.tv_1); init(); } public void init(){ RequestQueue queue=Volley.newRequestQueue(MainActivity.this); //首先建立一個請求隊列... queue.add(new StringRequest(Method.POST, url, new Listener<String>() { @Override public void onResponse(String response) { // TODO Auto-generated method stub System.out.println(response.toString()); tv.setText(response.toString()); //對擷取的資料進行顯示... }}, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub System.out.println(error.toString()); }}){ //在這個方法裡完成參數的相關傳遞.... @Override protected Map<String, String>getParams() throws AuthFailureError{ Map<String, String>map=new HashMap<String, String>(); map.put("name", "darker"); map.put("password", "49681888"); return map; }});} @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}
使用Post請求來完成驗證,毫無疑問,這裡由於我們傳遞的參數時正確的,因此用戶端會擷取到Receive name is:darker,Receive password is:49681888,Your Message are right!這段資訊...
StringRequest請求非常的簡單,涉及的東西也並不是很多,適合於發送網路請求來擷取相應的字串資料,呈遞給用戶端...
Android 學習筆記之Volley(六)實現擷取伺服器的字串響應...