學習內容:java
1.使用StringRequest實現獲取服務器的字符串響應...android
前幾篇一直都在對服務——響應過程的源碼進行分析,解析了整個過程,那麼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頁面代碼...那麼咱們沒法去解析這個頁面,可是瀏覽器倒是能夠的,咱們能夠經過瀏覽器去加載這個頁面...這只是一個簡單的小例子而已,目的是咱們須要清楚,服務器返回給咱們的是什麼數據...
網絡
第二個例子:
app
這是一箇中間用於過程處理的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請求很是的簡單,涉及的東西也並非不少,適合於發送網絡請求來獲取相應的字符串數據,呈遞給客戶端...