这是我现在碰到的一个问题,如果需要在TextView中加载大文本的时候,比如几M的txt文件时,TextView载入的时候会出现卡死的现象,甚至会出现异常等待退出出现。

解决办法之一就是通过“分段”或“分页”来显示数据,在TextView(嵌入在ScrollView之中实现了TextView的滚动)中滚动到底部的时候,再去加载下一部分的数据,依次类推,这样每次加载的数据相对来说都比较小,不会出现卡顿的现象。

遇到的问题是,如何监听ScrollView滚动的位置(滚动到顶部还是底部?)。

如下,通过自定义ScrollView类(BorderScrollView):

1 packagecom.wangjie.bigtextloadtest;2

3 importandroid.content.Context;4 importandroid.graphics.Rect;5 importandroid.util.AttributeSet;6 importandroid.widget.ScrollView;7

8 /**

9 * Created with IntelliJ IDEA.10 * Author: wangjie email:tiantian.china.2@gmail.com11 * Date: 13-9-612 * Time: 下午2:0613 */

14 public class BorderScrollView extendsScrollView{15 private longmillis;16 //滚动监听者

17 privateOnScrollChangedListener onScrollChangedListener;18

19 publicBorderScrollView(Context context) {20 super(context);21 }22

23 publicBorderScrollView(Context context, AttributeSet attrs) {24 super(context, attrs);25 }26

27 public BorderScrollView(Context context, AttributeSet attrs, intdefStyle) {28 super(context, attrs, defStyle);29 }30

31 @Override32 protected void onScrollChanged(int l, int t, int oldl, intoldt) {33 super.onScrollChanged(l, t, oldl, oldt);34

35 if(null ==onScrollChangedListener){36 return;37 }38

39 long now =System.currentTimeMillis();40

41 //通知监听者当前滚动的具体信息

42 onScrollChangedListener.onScrollChanged(l, t, oldl, oldt);43

44 if(now - millis > 1000l){45 //滚动到底部(前提:从不是底部滚动到底部)

46 if((this.getHeight() + oldt) != this.getTotalVerticalScrollRange()47 && (this.getHeight() + t) == this.getTotalVerticalScrollRange()){48

49 onScrollChangedListener.onScrollBottom(); //通知监听者滚动到底部

50

51 millis =now;52 }53 }54

55 //滚动到顶部(前提:从不是顶部滚动到顶部)

56 if(oldt != 0 && t == 0){57 onScrollChangedListener.onScrollTop(); //通知监听者滚动到顶部

58 }59

60

61 }62

63 publicOnScrollChangedListener getOnScrollChangedListener() {64 returnonScrollChangedListener;65 }66

67 public voidsetOnScrollChangedListener(OnScrollChangedListener onScrollChangedListener) {68 this.onScrollChangedListener =onScrollChangedListener;69 }70

71 /**

72 * 获得滚动总长度73 *@return

74 */

75 public intgetTotalVerticalScrollRange() {76 return this.computeVerticalScrollRange();77 }78

79 @Override80 protected intcomputeScrollDeltaToGetChildRectOnScreen(Rect rect) {81 return 0; //禁止ScrollView在子控件的布局改变时自动滚动

82 }83

84 }

滚动监听器接口OnScrollChangedListener:

1 packagecom.wangjie.bigtextloadtest;2

3 /**

4 * Created with IntelliJ IDEA.5 * Author: wangjie email:tiantian.china.2@gmail.com6 * Date: 13-9-67 * Time: 下午2:538 */

9 public interfaceOnScrollChangedListener {10 /**

11 * 监听滚动变化12 *@paraml13 *@paramt14 *@paramoldl15 *@paramoldt16 */

17 public void onScrollChanged(int l, int t, int oldl, intoldt);18

19 /**

20 * 监听滚动到顶部21 */

22 public voidonScrollTop();23

24 /**

25 * 监听滚动到底部26 */

27 public voidonScrollBottom();28

29 }

滚动监听器的空实现OnScrollChangedListenerSimple(简洁真正用时候的代码):

1 packagecom.wangjie.bigtextloadtest;2

3 /**

4 * Created with IntelliJ IDEA.5 * Author: wangjie email:tiantian.china.2@gmail.com6 * Date: 13-9-97 * Time: 下午2:398 */

9 public class OnScrollChangedListenerSimple implementsOnScrollChangedListener{10 @Override11 public void onScrollChanged(int l, int t, int oldl, intoldt) {}12

13 @Override14 public voidonScrollTop() {}15

16 @Override17 public voidonScrollBottom() {}18 }

异步加载分段文本(这里每次加载50行):

1 packagecom.wangjie.bigtextloadtest;2

3 importandroid.content.Context;4 importandroid.os.AsyncTask;5 importandroid.os.Handler;6 importandroid.view.View;7

8 import java.io.*;9

10 /**

11 * Created with IntelliJ IDEA.12 * Author: wangjie email:tiantian.china.2@gmail.com13 * Date: 13-9-614 * Time: 上午11:3415 */

16 public class AsyncTextLoadTask extends AsyncTask{17 privateContext context;18 privateMainActivity activity;19 privateBufferedReader br;20

21 publicAsyncTextLoadTask(Context context, BufferedReader br) {22 this.context =context;23 this.br =br;24 activity =(MainActivity)context;25 }26

27 @Override28 protectedString doInBackground(Object... params) {29 StringBuilder paragraph = newStringBuilder();30 try{31

32 String line = "";33

34 int index = 0;35 while(index < 50 && (line = br.readLine()) != null){36 paragraph.append(line + "\n");37 index++;38 }39

40 } catch(IOException e) {41 e.printStackTrace();42 }43

44 returnparagraph.toString();45 }46

47

48 @Override49 protected voidonPreExecute() {50 super.onPreExecute();51 }52

53 @Override54 protected voidonPostExecute(String result) {55 super.onPostExecute(result);56 activity.contentTv.setText(result);57 new Handler().postDelayed(newRunnable() {58

59 @Override60 public voidrun() {61 activity.contentScroll.scrollTo(0, 0); //记载完新数据后滚动到顶部

62 }63 }, 100);64 activity.isLoading = false;65 }66

67 }

真正使用分段加载数据Activity(这里加载一本小说《百年孤独》):

1 packagecom.wangjie.bigtextloadtest;2

3 importandroid.app.Activity;4 importandroid.content.Context;5 importandroid.os.Bundle;6 importandroid.widget.TextView;7

8 importjava.io.BufferedReader;9 importjava.io.IOException;10 importjava.io.InputStream;11 importjava.io.InputStreamReader;12

13 public class MainActivity extendsActivity {14 publicBorderScrollView contentScroll;15 publicTextView contentTv;16

17 privateBufferedReader br;18

19 privateContext context;20

21 public booleanisLoading;22

23

24 /**

25 * Called when the activity is first created.26 */

27 @Override28 public voidonCreate(Bundle savedInstanceState) {29 super.onCreate(savedInstanceState);30 setContentView(R.layout.main);31 context = this;32

33 contentTv =(TextView) findViewById(R.id.content);34 contentScroll =(BorderScrollView) findViewById(R.id.contentScroll);35

36 //注册刚写的滚动监听器

37 contentScroll.setOnScrollChangedListener(newOnScrollChangedListenerSimple(){38 @Override39 public voidonScrollBottom() {40 synchronized (MainActivity.class){41 if(!isLoading){42 isLoading = true;43 newAsyncTextLoadTask(context, br).execute();44 }45 }46 }47 });48

49 try{50 InputStream is = context.getAssets().open("bngd.txt");51 br = new BufferedReader(newInputStreamReader(is));52

53 newAsyncTextLoadTask(context, br).execute();54

55 }catch(Exception ex){56 ex.printStackTrace();57 }58

59

60 }61

62

63 @Override64 protected voidonDestroy() {65 super.onDestroy();66 if(null !=br){67 try{68 br.close();69 } catch(IOException e) {70 e.printStackTrace();71 }72 }73 }74

75 }

贴上布局:

1 <?xml version="1.0" encoding="utf-8"?>

2

3 android:orientation="vertical"

4 android:layout_width="fill_parent"

5 android:layout_height="fill_parent"

6 >

7

9 android:layout_width="fill_parent"

10 android:layout_height="fill_parent"

11 >

12

14 android:layout_width="fill_parent"

15 android:layout_height="fill_parent"

16 >

17

19 android:layout_height="wrap_content"

20 android:text="asdfasdf"

21 />

22

24 android:layout_width="fill_parent"

25 android:layout_height="wrap_content"

26 android:text="Hello World, MainActivity"

27 />

28

29

30

31

32

33

android分段加载_Android自定义ScrollView分段加载大文本数据到TextView相关推荐

  1. 大文本导入mysql_大文本数据,导入导出到数据库

    大文本数据,导入到数据库 240w的数据,利用plsql的文本导入器,导了一个半小时,且数据出现缺失. 两种方式导入到数据库 一,使用sql load 创建表 create table ext_gv_ ...

  2. android 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果

    背景 在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容.但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加 ...

  3. 安卓吸顶+下拉放大_Android自定义scrollView实现顶部图片下拉放大

    本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下 之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦 ...

  4. 星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星

    话不多说,上图 近日app需求弄一个等级展示,看了下UI图,只显示实星(点亮的星星).如图 但是网上关于星级评分的例子大多这样 也展示虚心星星 通过自定义Viewpackage com.starsba ...

  5. java调sqlloader,Java调用SqlLoader将大文本数据导入数据库

    项目描述 将一千万条数据,大约500M的文本文档的数据导入到数据库 分析:通过Java的IO流解析txt文本文档,拼接动态sql实现insert入库,可以实现,缺点如下 第一:IO流解析大文本文件对机 ...

  6. spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具

    文章目录 前言 一.java 导出PDF 的几个工具 1. PDF Box 2. JasperReports/jFreeReport导出 报表 PDF 3. itextpdf 导出PDF(敲重点) 二 ...

  7. 批量大文本筛选过滤工具开发记录

    批量大文本筛选过滤工具开发记录 本周花了两三天的时间做了一个大文本数据筛选工具,主要是针对excel打开很慢或者无法打开的几百兆乃至几G的csv.txt文件,提供常规的数据筛选.统计和输出功能.这个大 ...

  8. 028_jdbc-mysql大文本

    1. 例如我们存储一篇文章.大量文字, 就需要用到大文本. 2. MySQL的大文本类型有: tinytext, text, mediumtext, longtext. 3. JDBC中我们用Prep ...

  9. 数据库相关(JDBC,存储过程,以及大文本数据处理,mvc设计模式)

    目录 1.jdbc总结(模板.八股文): 2.CallableStatement:调用 存储过程.存储函数 3.1JDBC调用存储过程的步骤: 3.2调存储函数: 3.处理CLOB/BLOB类型 4. ...

最新文章

  1. UBuntu 系统设置禁用快捷键
  2. [转]使用Yii CUploadedFile上传文件(图片)
  3. [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料
  4. centos7 关闭selinux_Devops之LDAP部署安装(centos7+openLDAP+PhpLDAPAdmin)
  5. 【100题】第三十三 高级字符匹配(和谐系统原理)
  6. SQL Server时间粒度系列----第4节季、年时间粒度详解
  7. 什么是云存储 API
  8. javascript 函数与对象
  9. Oracle 索引的分类
  10. C语言实验及代码(详细注释)
  11. 《Excel高手捷径:一招鲜,吃遍天》一第29招 Excel 文件“减肥瘦身”秘诀
  12. win10 设备管理器显示便捷设备
  13. 不需要再手写 onSaveInstanceState 了,因为你的时间非常值钱
  14. MS104-SH4 与Toppers/JSP(µItron)嵌入式系统构筑
  15. java生成二维码扫描跳转到指定的路径URL
  16. Algorithm(算法
  17. 【基础知识】~ LUT、CLB、面积/速度问题
  18. CentOs7关于图形界面系统和图形界面程序
  19. poj 1228 Grandpa's Estate
  20. FilmLight Daylight for mac(视频转码播放工具)

热门文章

  1. 记一次bugku awd的pwn解
  2. vue-element查看pdf
  3. 第一章、架设服务器前的准备工作
  4. 旋流除污器(旋流除砂器)工作原理
  5. 利用遗忘曲线记英语单词 -- 41天
  6. 第3章 知识抽取:问题、方法和数据
  7. cnpm能用npm install吗_npm依赖版本变动引发的惨案
  8. python能打开的txt文件编码_Python读写txt文件时的编码问题
  9. Shell脚本创建用户
  10. FPGA数字信号处理(24)数字相关器设计(简化结构)