zoukankan      html  css  js  c++  java
  • 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请求非常的简单,涉及的东西也并不是很多,适合于发送网络请求来获取相应的字符串数据,呈递给客户端...

     

  • 相关阅读:
    01背包--小P寻宝记——粗心的基友
    StringIndexOutOfBoundsException
    2014秋C++ 第8周项目 分支程序设计
    【JavaScript】正則表達式
    专业函数画图软件Origin
    设计模式学习–Decorator
    python使用requests模块模拟登陆知乎
    分享几个比较好的站点
    【转载】selenium之 定位以及切换frame(iframe)
    判断Selenium加载完成
  • 原文地址:https://www.cnblogs.com/RGogoing/p/4908655.html
Copyright © 2011-2022 走看看