文档章节

使用AsyncHttpClient碰到的问题及解决方法

 红豆与绿豆
发布于 2015/10/20 11:27
字数 1135
阅读 102
收藏 3
点赞 0
评论 0

之前做一个项目,项目里面的布局是这样的:一个ViewpagerViewpager里面有三个Fragment,在第二个Fragment里面有一个ListView,使用了BaseAdapter来显示item。当时因为图方便,把获取数据源mData的方法直接写在了adapter的构造方法里面,数据源通过syncHttpClient向后台请求参数获取。

 

大概的代码如下:

1 private LayoutInflater mInflater;

 2 private static List<Map<String, Object>> mData = new ArrayList<Map<String, Object>>();

 3 private RequestQueue queue;

 4 private ImageLoader imageLoader;

 5 private Context context;

 6 private UserInfoEntity userInfoEntity;

 7

 8 public LessonEndingAdapter(Context context) {

 9        this.context = context;

10        mInflater = LayoutInflater.from(context);

11        AuthCheck ac = new AuthCheck();

12        this.userInfoEntity = ac.getUserInfo(context);

13        queue = Volley.newRequestQueue(context);

14        imageLoader = new ImageLoader(queue, new BitmapCache());

15        init();

16 }

17 private void init() {

18        mData.clear();

19        String url = Codes.URL_ROOT + "/lesson/studied.api?" + "userid="+ context.getSharedPreferences(Codes.USERINFO, 0).getInt(Codes.USERID, 0) + "&token="+ context.getSharedPreferences(Codes.USERINFO, 0).getString(Codes.TOKEN, "");

20        SyncHttpClient client = new SyncHttpClient();

21        client.get(url, new JsonHttpResponseHandler() {

22            @Override

23            public void onSuccess(int statusCode, Header[]     headers,JSONObject response) {

24        super.onSuccess(statusCode, headers, response);

25        if (statusCode == 200) {   

26              processJsonData(response);

27        }

28    }

29   });

30 }

 

这里就不详细的讲SyncHttpClient的用法了,只说说我在使用过程中碰到的一些问题和解决办法。

 

      当时我在init()中用的是AsyncHttpClient(代码里面是SyncHttpCilent),没在意AsyncHttpClientSyncHttpClient的区别,随意挑了前者,结果问题就出现了:

 

第一次init没有问题,但是当init操作执行几次后,页面变成了空白一片,listView中的item都消失了。

 

      我在adapterinit(),getView(),getCount()中都写了Log,发现init()方法中的mData成功获取了数据,但是getCount方法中显示item数目为0,而getView中的log更是直接就没打印出来。一般来说,在一个类中,代码的执行顺序肯定是:变量声明->构造方法->其他方法,所以init()应该是在getCountgetView之前执行的。现在数据获取到了,但是却没有在布局中显示出来,惯性思维下,我觉得应该是adapter出现了问题。

 

      我先从adapternotifyDataSetChanged()方法入手,一步步点进去,最后进入notifyChanged()方法,代码如下:

1 public void notifyChanged(){

2    synchronized(mObservers){

3      //since onChanged() is implemented by the app,it could do anything,including

4      //removing itself from{@link mObservers}-and that could cause problem if

5      //an iterator is used om the ArrayList{link mObservers}.

6      //to avoid such problems,just march thru the list in the reverse order.

7      for(int i = mObservers.size() - 1;!>=0;i--){

8        mObservers.get(i).onChanged();

9      }  

10   }

11 }

 

从字面上看,就是一个循环,对每一个item进行判断是否改变,若改变的话对布局进行修改。但现在的问题是getCount0,也就是说并未进行这个循环,通过Log打印的顺序,我对getViewLog没打出来的问题有了大致的猜想:

 

      adapter中方法执行的顺序为:构造方法->getCount->getView,其他方法在adapter中并不是必不可少的,暂且不论。当listView绑定了一个adapter时,程序会执行构造方法,然后执行getCount()getCount()会重复执行几遍,当getCount方法不为0时,执行getView方法。若getCount()一直为0,那么就不执行getView(),布局自然而然就不会显示出来。

 

      现在的问题就是,数据取到了(mData有数据),但是getCount为什么一直为0呢?我想来想去也只有从第三方类库SyncHttpClient入手了。在网上查了一下SyncHttpClientAsyncHttpClient的特性,发现字面意思已经表达的很清楚了:sync->同步,async->异步……也就是说,当用AsyncHttpClient时,程序会自动新开一个线程,数据获取在一个线程,而adapter中的getCount又在另一个线程,两者的进度是无法把握的。结果很明显了,虽然是init()方法先执行,但是由于AsyncHttpCilent新开了一个线程,导致在请求参数的过程中,getCount()也已经开始执行,AsyncHttpClient是一个较为耗时的操作,所以每次getCount都先于client.get执行完毕,这就解释了为什么getCount一直为0mData又不为空了!

 

      既然发现了问题那就很好解决了,最简单的方法就是把AsyncHttpClient改成SyncHttpClient。但是这样做性能很差,这就失去了异步操作存在的意义了。我的方法是在AsynHttpClient方法的末尾,即数据取完之后,加一个adapter.notifyDataSetChanged(),这时程序会自动再次执行getCount,很显然这次的getCount就不为0了,紧接着就执行getView显示布局,ok,问题解决。当然,开发完APP也是需要进行全方位的检测:www.ineice.com


© 著作权归作者所有

共有 人打赏支持
粉丝 3
博文 49
码字总数 21798
作品 0
南昌
android-async-http上传文件

AsyncHttpClient, RequestParams ,AsyncHttpResponseHandler三个类使用方法 (1)AsyncHttpClient public class AsyncHttpClient extends java.lang.Object 该类通常用在android应用程序中创建......

习惯_搬砖
2014/11/07
0
1
android-async-http AsyncHttpClient介绍

前一阵子刚搬了家,加上公司要发新版本,所以一直比较忙,文章也好几周没更新了。难得这个周末有空,正好周内偶然间闲逛 发现这个很不错的第三方开源类库,针对Android开发中发送http请求的。...

程序袁_绪龙
2015/07/08
0
0
android-async-http使用例子

android-async-http是一个强大的第三方开源网络请求库, 官网源码:https://github.com/loopj/android-async-http 官网教程:http://loopj.com/android-async-http/ 这个网络请求库是基于Apa...

penngo
2015/08/05
0
0
android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架

前端 andoid activity用到的函数 AsyncHttpClient 是一个框架提供的库 可以异步传输,使用时需下载android-async-http-1.4.4.jar包导入到项目中 [java] view plaincopy public static void r...

postdep
2015/02/03
0
2
async-http-client开源库学习笔记(一)

文前闲话 作为一个Android开发的大龄初学者,面对扑面而来的各种姿势的Android的开源组件,让人倍感窒息,难以应对。无奈为了养家糊口,虽然已近不惑,人老珠黄,也只能废寝忘食,逐个体位细...

马丁当
2015/08/19
0
3
servlet接收post方式传参,但参数全部为null

app使用asynchttpclient调用tomcat(版本7) servlet,post方式,servlet接收到的参数全部为null,这种情况偶尔就会出现,参数大小是没有限制的,请问这是什么原因...

hhl3136
04/21
0
0
Android Volley完全解析(一),初识Volley的基本用法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482095 1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用...

mingxun
2014/04/18
0
0
翻译:introduce to tornado-Asynchronous Web Services

异步的web请求 迄今为止,我们通过tornado这个强大的框架的功能创建了很多web应用,它简单,易用,它有足够强大的理由让我们选择它做为一个web项目的框架.我们最需要使用的功能是它在服务端的异步...

f1eming
2013/05/16
0
7
Android 轮询最佳实践 Service + AlarmManager+Thread

android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询。 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高...

yaly
2015/05/07
0
0
tornado 源码分析 之 异步io的实现方式

前言 AsyncHTTPClient : fetch fetch_impl _HTTPConnection TCPClient connect _Connector try_connect createstream IOStream connect addio_state 小总结: ioloop IOStream.handleevents ......

国夫君
2015/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(七)-添加自定义View和对其

CoreText进阶(七)-添加自定义View和对其 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多...

aron1992
7分钟前
0
0
Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
18分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
27分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
38分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
39分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
41分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
45分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
51分钟前
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
57分钟前
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部