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


 

 

學習內容:

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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM