文档章节

Volley之自定义GsonRequest

新根
 新根
发布于 2015/11/21 17:36
字数 608
阅读 272
收藏 3

3 月,跳不动了?>>>

第一步:导入volley 和gson的jar

第二步:<uses-permission android:name="android.permission.INTERNET" />

第三步: static 的单例类,用于管理volley中的方法

public class MySingleton {
          private static MySingleton mInstance;
          private static Context context;
          private RequestQueue mRequestQueue;
          public static synchronized MySingleton getInstance(Context context) {
                     if (mInstance == null) {
                               mInstance = new MySingleton(context);
                     }
                      return mInstance;
            }

           private MySingleton(Context mcontext) {
                   context = mcontext;
                    mRequestQueue = getRequestQueue();
           }

            public RequestQueue getRequestQueue() {
                      if (mRequestQueue == null) {// ApplicationContext确保volley的队列在app运行中都存在
                      mRequestQueue = Volley.newRequestQueue(context.getApplicationContext());
                     }
                    return mRequestQueue;
              }


               public <T> void addToRequestQueue(Request<T> req) {
                     getRequestQueue().add(req);
                  }
}

第四步: 自定义Gson请求
public class GsonRequest<T> extends Request<T> {

             private final Listener<T> mListener;
             private Gson mGson;
             private Class<T> mClass;

            public GsonRequest(String url, Class<T> mClass, Listener<T> mListener,ErrorListener listener) {
                 this(Method.GET, url, mClass, mListener, listener);
             }

            public GsonRequest(int method, String url, Class<T> mClass,
                                       Listener<T> mListener, ErrorListener listener) {
                            super(method, url, listener);
                            mGson = new Gson();
                            this.mClass = mClass;
                            this.mListener = mListener;
           }

          @Override//将服务器响应的数据解析出来,然后Gson的fromJson方法将数据组装成对象,在工作线程中运行
          protected Response<T> parseNetworkResponse(NetworkResponse response) {
                     try {
                                  String jsonString = new String(response.data,
                                  HttpHeaderParser.parseCharset(response.headers));
                                   return Response.success(mGson.fromJson(jsonString, mClass),
                                                            HttpHeaderParser.parseCacheHeaders(response));
                      } catch (UnsupportedEncodingException e) {
                                 return Response.error(new ParseError(e)); 
                      }
 
            }
            //最终的数据进行回调给ui线程
           protected void deliverResponse(T response) {
                     mListener.onResponse(response);
           }

}

案例:

url :"http://www.weather.com.cn/data/sk/101010100.html"
return result:
                    {"weatherinfo": {"city":"北京","cityid":"101010100","temp":"19",
                             "WD":"南风","WS":"2级","SD":"43%", "WSE":"2","time":"19:45","isRadar":"1",
                              "Radar":"JC_RADAR_AZ9010_JB"}
                     }
第五步:定义实体类和引用类(根据实际返回结果写)
/**
 * 实体类的引用类
 *
 * @author  Administrator
 *
 */
public class Entity_Quote {
            private Entity  weatherinfo;

            public Entity getEntity() {
               return entity;
              }

            public void setEntity(Entity entity) {
                   this.entity = entity;
            }
}

/**
 * 实体类
 * @author  Administrator
 *
 */
public class Entity {
             private String city;
             private String temp;
             private String time;
             public String getCity() {
                 return city;
             }
             public void setCity(String city) {
                 this.city = city;
             }
             public String getTemp() {
                  return temp;
             }
             public void setTemp(String temp) {
                   this.temp = temp;
             }
            public String getTime() {
                  return time;
             }
            public void setTime(String time) {
                 this.time = time;
             }
   
}

第六步:activity中使用
public class MainActivity extends Activity {
               TextView tv;
               public String url=  "http://www.weather.com.cn/data/sk/101010100.html";
               public  final static String  TAG=MainActivity.class.getSimpleName();
                @Override
               protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                         tv = (TextView) findViewById(R.id.mian_tv);
 
                       sendRequest();
              }


            //volley适合数据量小且通信频繁,但是不可用数据大的操作,如流媒体,下载文件(downloadManager)等。
           private void sendRequest() {
                 GsonRequest<Entity_Quote>  gsonRequest= 

                                   new GsonRequest<Entity_Quote>(url,Entity_Quote.class,new   Listener<Entity_Quote>() {
                                                                @Override
                                        public void onResponse(Entity_Quote quote) {//返回一个引用类,通过引用类拿到实体类
                                                        Entity entity=quote.getEntity();
                                                        tv.setText(entity.getCity()+""+entity.getTemp()+""+entity.getTime());
    
                                        }
                                    }, new ErrorListener() {
                                      @Override
                                        public void onErrorResponse(VolleyError error) {
                                            Log.e("TAG", error.getMessage(), error);
                                    }
                                });
                      gsonRequest.setTag(TAG);//添加标记,便于取消
                      MySingleton.getInstance(this).addToRequestQueue(gsonRequest);
                      //可以在任何线程中添加一个请求,    但是响应结果都是返回在主线程中
            }
 
           @Override
            protected void onStop() {
                   RequestQueue mQueue=MySingleton.getInstance(this.getApplicationContext()).getRequestQueue();
 
                   if(mQueue!=null){
                    mQueue.cancelAll(TAG);//取消用TAG标记的request
                   }
                     super.onStop();
            }
}

© 著作权归作者所有

新根
粉丝 5
博文 28
码字总数 9431
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

Android Volley完全解析(三),定制自己的Request

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763 经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest、JsonRequest、Ima...

mingxun
2014/05/06
233
0
Android Volley完全解析(三),定制自己的Request

版权声明:本文出自郭霖的博客,转载必须注明出处。 目录(?)[+] 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763 经过前面两篇文章的学习,我们已经掌握了Volle...

farina
2016/08/26
10
0
volley 自定义Request出现错误

自定义Request如下: public class GSONRequest extends Request{ private Listener listener; private Class mclass; private Gson gson; public GSONRequest(int method, String url, Cla......

流年逝水
2014/05/16
1.9K
0
个人总结之Volley的cookie处理

Volley是很好用的网络请求框架,但是有时候我们需要用到会话的管理,而Volley是不支持cookie的,不过庆幸的是Volley的扩展性很强,所以我们可以重写一些方法来达到我们想要的效果,例如登陆的时候...

Magic_锋
2016/02/24
93
0
Android 网络通信框架Volley简介(Google IO 2013)

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=playerembedded 1. 什么是Volley 在这之前,我们在程序中需......

今日竹石
2015/02/28
228
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么只能在头文件中实现模板? - Why can templates only be implemented in the header file?

问题: Quote from The C++ standard library: a tutorial and handbook : 引用来自C ++标准库:教程和手册 : The only portable way of using templates at the moment is to implement t......

javail
今天
19
0
Gradle 6 针对已有的构建如何创建一个构建扫描

有关构建扫描的定义为: 构建扫描(build scan)是一个中心化并且可以共享的构建记录。这个构建记录通常能够告诉在构建中发生了什么并且为什么会发生。 通过应用构建扫描插件到你的项目中,你...

honeymoose
今天
17
0
C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

一、malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数。free是进行内存释放的库函数。 1、函数原型 #include <stdlib.h> void *malloc( size_t size ); v...

shzwork
今天
17
0
什么是JavaBean? - What is a JavaBean exactly?

问题: I understood, I think, that a "Bean" is a Java class with properties and getters/setters. 我认为,“ Bean”是具有属性和getter / setter的Java类。 As much as I understand,......

技术盛宴
今天
27
0
深圳援鄂最后一批工作人员归来,88万元关爱金发放至85人

中国公益在线3月31日深圳讯 深圳援鄂最后一批工作人员归来......深圳市民政局、深圳市卫健委和深圳市慈善会发起了“深爱战疫天使基金”项目,联合龙华区慈善会和 永贤慈善基金会,进行第二次...

传承天下融媒体中心
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部