Android 學習筆記之Volley(六)實現獲取服務器的字符串響應...

 

 

學習內容: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請求很是的簡單,涉及的東西也並非不少,適合於發送網絡請求來獲取相應的字符串數據,呈遞給客戶端...

相關文章
相關標籤/搜索