关于数据不满一屏时,下拉刷新和上拉加载同时响应出错解决办法(非正规方式)
2014-11-11 17:53
369 查看
在使用下拉刷新时,我使用的是PullToRefreshListView
使用方式是将开源的java文件拷贝到项目中,使用方法是直接在xml中:
其他适配器等的设定跟使用listview一样。
但是问题来了:
数据不满一屏时,出现的情况是当下拉的同时触发上拉加载更多,对于标记最后一条记录的变量,有于是全局变量,造成会在多线程中不安全的被修改,造成数据出错。
解决方式有:将标记设定位局部变量,全局变量是不安全的;判断哪条线程是否有执行,若有另一个在执行,则这个进行wait,避免同时访问那个标示;对变量进行加锁,使它不能被同时访问。
上面的解决办法由于能力有限,没能实现,于是使用了另外的办法:
在源码PullToRefreshBase.java中:
方法很笨,没有技术含量,希望大家给出好的解决办法。
使用方式是将开源的java文件拷贝到项目中,使用方法是直接在xml中:
<com.yang.pullrefresh.ui.PullToRefreshListView android:id="@+id/pull_listview" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/mListView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/gray" android:divider="#999999" android:dividerHeight="1dp" > </ListView> </com.yang.pullrefresh.ui.PullToRefreshListView>
其他适配器等的设定跟使用listview一样。
但是问题来了:
数据不满一屏时,出现的情况是当下拉的同时触发上拉加载更多,对于标记最后一条记录的变量,有于是全局变量,造成会在多线程中不安全的被修改,造成数据出错。
解决方式有:将标记设定位局部变量,全局变量是不安全的;判断哪条线程是否有执行,若有另一个在执行,则这个进行wait,避免同时访问那个标示;对变量进行加锁,使它不能被同时访问。
上面的解决办法由于能力有限,没能实现,于是使用了另外的办法:
在源码PullToRefreshBase.java中:
/** * 开始刷新,当下拉松开后被调用 */ protected void startRefreshing() { // 如果正在下拉刷新或正在上拉加载 if (isPullRefreshing() <span style="color:#ff0000;">|| isPullLoading()</span>) { return; } mPullDownState = State.REFRESHING; onStateChanged(State.REFRESHING, true); if (null != mHeaderLayout) { mHeaderLayout.setState(State.REFRESHING); } if (null != mRefreshListener) { // 因为滚动回原始位置的时间是200,我们需要等回滚完后才执行刷新回调 postDelayed(new Runnable() { @Override public void run() { mRefreshListener.onPullDownToRefresh(PullToRefreshBase.this); } }, getSmoothScrollDuration()); } } /** * 开始加载更多,上拉松开后调用 */ protected void startLoading() { // 如果正在上拉加载或正在下拉刷新 if (isPullLoading() <span style="color:#ff0000;">|| isPullRefreshing()</span>) { return; } mPullUpState = State.REFRESHING; onStateChanged(State.REFRESHING, false); if (null != mFooterLayout) { mFooterLayout.setState(State.REFRESHING); } if (null != mRefreshListener) { // 因为滚动回原始位置的时间是200,我们需要等回滚完后才执行加载回调 postDelayed(new Runnable() { @Override public void run() { mRefreshListener.onPullUpToRefresh(PullToRefreshBase.this); } }, getSmoothScrollDuration()); } }红色部分是让两个操作只能执行一个,避免同时进行。
方法很笨,没有技术含量,希望大家给出好的解决办法。
相关文章推荐
- 关于数据库连接出错(错误信息:[无法加载dll(oci.dll)])的解决办法
- 关于windows10系统,玩英雄联盟加载无响应问题的解决办法
- 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法
- Vue关于数据绑定出错解决办法
- Excel大批量导入内存溢出,多线程SAX读取方式解决,及页面返回数据响应超时解决办法
- windows启动时加载*.dll文件出错的解决办法
- 关于在updatapanel中使用javascript出错解决办法
- [Javascript]关于在ASP.NET环境中调用梅花雨的日历控件出错的解决办法
- Visual Studio《加载此属性页时出错》的解决办法[转]
- 在FF中浏览本地HTML页面,该页面中的js未加载远程数据的解决办法。
- 数据备份中可能出错的情况及解决办法
- 关于水晶报表加载失败的解决办法
- AJAX时,以GET方式提交数据,IE进行缓存,FF不缓存,四种解决的办法
- 关于从toolbox内拖放控件到form时出错的解决办法
- 关于水晶报表加载失败的解决办法.
- 关于水晶报表加载失败的解决办法.
- 数据备份中可能出错的情况及解决办法
- 关于使用DirectShow架构,传输YUV420数据的Filter与Video Renderer Filter连接问题的解决办法。
- SWT中定时器的一种特殊实现方式/SWT中线程互访时display.asyncExec/display.syncExec...程序死掉无响应的解决办法