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

大概的代码如下:

 private LayoutInflater mInflater;
private static List<Map<String, Object>> mData = new ArrayList<Map<String, Object>>();
private RequestQueue queue;
private ImageLoader imageLoader;
private Context context;
private UserInfoEntity userInfoEntity; public LessonEndingAdapter(Context context) {
this.context = context;
mInflater = LayoutInflater.from(context);
AuthCheck ac = new AuthCheck();
this.userInfoEntity = ac.getUserInfo(context);
queue = Volley.newRequestQueue(context);
imageLoader = new ImageLoader(queue, new BitmapCache());
init();
}
private void init() {
mData.clear();
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, "");
SyncHttpClient client = new SyncHttpClient();
client.get(url, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,JSONObject response) {
super.onSuccess(statusCode, headers, response);
if (statusCode == 200) {
processJsonData(response);
}
}
});
}

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

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

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

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

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

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

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

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

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

使用AsyncHttpClient碰到的问题及解决方法的更多相关文章

  1. MYSQL导入大量数据碰到的问题及解决方法

    在项目中,经常会碰到往数据库中导入大量数据,以便利用sql进行数据分析.在导入数据的过程中会碰到一些需要解决的问题,这里结合导入一个大约4G的txt数据的实践,把碰到的问题以及解决方法展现出来,一方面 ...

  2. 在CentOS7.1上安装Gitlab碰到的问题及解决方法

    一 前言 关于在CentOS7上安装Gitlab, 官方文档已经很详细了,步骤大家按照官方的安装文档一步一步安装即可, 这里就不在累述.官方安装文档地址:  https://about.gitlab. ...

  3. InstallShield 工程类型MSI 使用过程中碰到的问题及解决方法。

    原文 http://www.cnblogs.com/daocaorenbx/p/InstallShield.html 一.安装完 桌面创建IE快捷方式: 1.  install script可以直接建 ...

  4. 安装opencv3.3.0碰到的问题及解决方法

    出处:http://osask.cn/front/ask/view/258965 CMakeError.log Compilation failed: source file: '/home/jhro ...

  5. 安装ftp碰到的问题及解决方法

    1   CRT显示乱码:     本地windows机器.改动SecureCRT的设置.找到"选项"->"会话选项"->"外观" ...

  6. Error:const char* 类型的实参和LPCWSTR类型的形参不兼容的解决方法。

    在C++的Windows 应用程序中经常碰到这种情况. 解决方法: 加入如下转换函数: LPCWSTR stringToLPCWSTR(std::string orig) { size_t origs ...

  7. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法

    Zend Guard是目前市面上最成熟的PHP源码加密产品了.刚好需要对自己的产品进行加密,折腾了一晚上,终于搞定,将碰到的问题及解决方法记录下来,方便日后需要,也可以帮助其他人.我使用的是Wamps ...

  8. AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决

    今天使用 AsyncHttpClient  开源库,遇到个很崩溃的问题: 方法  setEnableRedirects(false); 从名称上看应该是重定向开关的方法,设置为 false 后则普通请 ...

  9. 利用pyinstaller生成exe文件碰到的一些问题及解决方法

    在“开源图像标注工具labelme的安装使用及汉化”这篇博客中,使用pyinstaller将labelme项目的入口python文件main.py打包,生成了main.exe文件,可以在Windows ...

随机推荐

  1. asp.net获取当前页面文件名,参数,域名等方法。统一session验证和权限验证的方法

    转:http://blog.csdn.net/llll29550242/article/details/6054323 ASP.net后台获取当前页面的文件名 System.IO.Path.GetFi ...

  2. Navigation Drawer(导航抽屉)

    目录(?)[-] 创建一个导航抽屉 创建抽屉布局 初始化抽屉列表 处理导航项选点击事件 监听导航抽屉打开和关闭事件 点击应用图标来打开和关闭导航抽屉 创建一个导航抽屉 导航抽屉是一个位于屏幕左侧边缘用 ...

  3. Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码

    摘要 终端传值给Makefile,咋传?只需在终端输入以下命令,那么就可以在Makefile文件中放心大担的使用$(abcde)这个变量了,它的值为BBB Makefile fun.h #includ ...

  4. win8下光驱消失

    导入这个注册表后重启,总算能读了..reg add "HKLM\System\CurrentControlSet\Services\atapi\Controller0" /f /v ...

  5. Ext.form.FormPanel定义的参数说明

    1.formId : String (可选的)FORM标签的id(默认是自动生成的). 2.labelWidth : Number 标签的宽度.该属性级联于子容器. 3. itemCls : Stri ...

  6. Js 时间轴和拓扑图

    http://code.csdn.net/news/2819345 http://visjs.org/

  7. JavaScript高级程序设计27.pdf

    第11章 DOM扩展 W3C将一些已经成为事实标准的专有扩展标准化并写入规范当中.对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 选择符API 就是根据CSS选择符选择与 ...

  8. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...

  9. MySQL数据库MyISAM和InnoDB存储引擎的比较(转)

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...

  10. hdu 4773 Problem of Apollonius

    莫名其妙就AC了-- 圆的反演-- 神马是反演? 快去恶补奥数-- #include<iostream> #include<map> #include<string> ...