原文:http://zkl-1987.iteye.com/blog/1055394

由于现在TXT文本很多,特别是好多小说也是以这个文件格式出现,毕竟这个格式所占用不必要的空间比较小。像我这样的人就非常喜欢在手机上看小说,经常下载好多的TXT格式小说存到手机上以便空闲时候看。于是乎也试图做了一下如何在Android上实现看大文本的txt文档。 虽然现在类似的应用还真不少,不过个人看到的基本不公布源码,而公布源码的基本都是不能看大文本的,所以自己去实现了一下。现在只是粗略实现了,实现方法是每次当滑动到屏幕底端时,从文件读2048字节出来显示到屏幕上。到屏幕底端再读是为了不给用户有刷屏的感觉,使用起来感觉不到只读了2048字节出来,比较流畅。现在由于只是试验流畅性,所以只写了向下浏览的,而没有写往回读,也就是说往回翻是无效的。 废话不多说,代码是王道。这个是主文件:

package net.wangliping.filemanager;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.nio.CharBuffer;

import android.app.Activity;

import android.net.Uri;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.text.TextUtils;

import android.util.Log;

import android.widget.ScrollView;

import net.wangliping.test.R;

public class TxtReader extends Activity implements

RealTimeTextView.OnTextChangedListener {

private static final String LOG_TAG = "TxtReader";

private static final int SHOW_TXT = 1;

private SwanTextView mTextShow;

private ScrollView mScrollView;

private String mStringShow = null;

private boolean mContinueRead = true;

private boolean mHaveNewText = false;

private int mCurBottom = -1;

private int mNum = -1;

private final Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case SHOW_TXT:

mTextShow.setText((CharBuffer) msg.obj);

break;

default:

super.handleMessage(msg);

}

}

};

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.txt_reader);

Uri uri = getIntent().getData();

mScrollView = (ScrollView) findViewById(R.id.text_show_scroll);

mTextShow = (RealTimeTextView) findViewById(R.id.text_show);

mTextShow.setOnTextChangedListener(this);

new TextShowTask().execute(uri);

}

private void showText(Uri uri) throws IOException, InterruptedException {

InputStreamReader is = new InputStreamReader(new FileInputStream(

uri.getPath()), "GB2312");

StringBuilder sb = new StringBuilder();

char[] buf = new char[1024 * 2];

while (true) {

if (mCurBottom == mScrollView.getScrollY()) {

Log.d(LOG_TAG, "curBtm:" + mCurBottom + " scroll:"

+ mScrollView.getScrollY());

mCurBottom = -1;

mNum++;

if (mNum % 2 == 0) {

mContinueRead = true;

Log.d(LOG_TAG, "YES");

}

}

if (mContinueRead && is.read(buf) > 0) {

mContinueRead = false;

if (sb.length() > 4096) {

sb.delete(0, 2048);

Message msg = mHandler.obtainMessage(SHOW_TXT);

msg.obj = CharBuffer.wrap(sb.toString());

mHandler.sendMessage(msg);

mStringShow = sb.append(buf).toString();

mHaveNewText = true;

} else {

while (sb.length() < 4096) {

sb.append(buf);

is.read(buf);

}

sb.append(buf);

Message msg = mHandler.obtainMessage(SHOW_TXT);

msg.obj = CharBuffer.wrap(sb.toString());

mHandler.sendMessage(msg);

}

}

}

}

private class TextShowTask extends AsyncTask {

@Override

protected void onPostExecute(Object param) {

Log.d(LOG_TAG, "Send broadcast");

}

@Override

protected Object doInBackground(Object... params) {

Uri uri = (Uri) params[0];

try {

showText(uri);

} catch (Exception e) {

Log.d(LOG_TAG, "Exception", e);

}

return null;

}

}

@Override

public void onPreOnDraw(int bottom) {

mCurBottom = bottom - mScrollView.getHeight();

if (mHaveNewText && !TextUtils.isEmpty(mStringShow)) {

mHaveNewText = false;

Message msg = mHandler.obtainMessage(SHOW_TXT);

msg.obj = CharBuffer.wrap(mStringShow);

mHandler.sendMessage(msg);

}

}

}

这个为了得到TextView底部的位置而扩展了TextView类:

package net.wangliping.filemanager;

import android.content.Context;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.widget.TextView;

public class SwanTextView extends TextView {

private int mPreBottom = -1;

private OnTextChangedListener textChangedListener = null;

public SwanTextView(Context context) {

super(context);

}

public SwanTextView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public SwanTextView(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

}

@Override

protected void onDraw(Canvas canvas) {

if (mPreBottom != getBottom()) {

mPreBottom = getBottom();

if (textChangedListener != null)

textChangedListener.onPreOnDraw(mPreBottom);

}

super.onDraw(canvas);

}

public static interface OnTextChangedListener {

public void onPreOnDraw(int bottom);

}

public void setOnTextChangedListener(OnTextChangedListener listener) {

textChangedListener = listener;

}

}

这个就是资源文件了:

android:id="@+id/text_show_linear" android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="fill_parent" android:layout_height="fill_parent">

android:id="@+id/text_show" android:layout_width="fill_parent"

android:layout_height="wrap_content" android:scrollbars="none">

Android读取大文件方法,Android 读取大文件txt相关推荐

  1. android颜色值的表示方法android:background=#FFFFFFFF的意思

    android颜色值的表示方法 android:background="#FFFFFFFF"的意思 Android中的颜色值是通过红(Red).绿(Green).蓝(Blue)三原 ...

  2. android写入文件方法,Android 追加写入文件的三种方法

    一.使用FileOutputStream 使用FileOutputStream,在构造FileOutputStream时,把第二个参数设为true public static void method1 ...

  3. android的反调试方法,Android平台融合多特征的APP反调试方法与流程

    本发明涉及Android平台融合多特征的APP反调试方法,属于计算机与信息科学技术领域. 背景技术: 应用程序本身并不具备反调试的功能,但是动态调试是动态分析应用逻辑.动态脱壳等攻击方式所采取的必要手 ...

  4. android sdk离线安装方法,Android 4.0 SDK的离线方式安装

    之前曾经在网上找过离线安装SDK的方式,也成功下载过,都是在网址: http://dl-ssl.google.com/android/repository/ 后面跟上 类似于"android ...

  5. android 矢量图片使用方法,Android中的矢量图

    概述 VectorDrawable是通过XML文件中的一系列点,线和曲线及其相关颜色信息定义的. 使用VectorDrawable的主要优点是图像可扩展性. 它可以缩放而不损耗显示质量,这意味着相同的 ...

  6. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  7. android studio 优化提速方法,Android Studio速度慢(如何加速)?

    我最近从Eclipse升级到Android Studio,但我并不喜欢这种体验. 我将它们与具有16GB内存的Windows 7 64位旗舰版和运行NVidia Geforce 780的Intel i ...

  8. android中的add方法,Android中Fragment怎么addView?

    慕勒3428872 Fragment是Android honeycomb 3.0新增的概念,在Android--Fragment介绍.AndroidFragment使用.Android Fragmen ...

  9. android耗电怎么解决方法,Android手机媒体进程耗电严重怎么办

    确认是否是媒体扫描进程造成的耗电(我的是samsung,如果是其它手机也可以找到对应步骤) 在-设置-电池,可以看到媒体耗电异常(我截图截得早)如果确实是这个问题的话,你很有可能看到媒体耗的电占70% ...

  10. android 开启子线程方法,android中开启子线程

    AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/ ...

最新文章

  1. 用AI打造科技公益新模式,腾讯发起公益创新挑战赛,聚焦三大社会问题
  2. Twiiter,下一个热点
  3. python读取大文件的某行_Python按行读取文件的实现方法【小文件和大文件读取】...
  4. 北漂程序员边城的幸福生活
  5. 【Python】异常捕获
  6. C++的高效从何而来
  7. python 子线程返回值_python-从线程返回值
  8. django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV
  9. mybatis直接执行sql语句后续之一
  10. 【论文+推导】Predictability and Prediction of Human Mobility Based on Application-Collected Location Data
  11. matlab 亚像素边缘检测,一种亚像素边缘检测方法与流程
  12. 光照度传感器之RS485 通信与 Modbus 协议
  13. 统计分布——常用且重要的三种分布
  14. powerquery分组_PowerQuery分组返回所有行之后还原列顺序
  15. 基于OSGi的企业级开发框架实践——OSGi Annotations
  16. Matlab实现求解乘法逆元实验
  17. flask装饰器顺序
  18. python tkinter 实现鼠标按下和弹起事件监测
  19. 南邮 丘比龙De女神
  20. 小数点后几位截取办法

热门文章

  1. 逻辑回归算法处理简单数据
  2. 企业数字化转型系列(3):企业数字化转型到底要转什么?
  3. NX UG 手动创建向导
  4. 机器学习数据处理-数据归一化
  5. Java项目:基于springboot+vue的餐厅点定餐外卖系统—计算机毕业设计
  6. Win7文件夹共享与远程桌面
  7. 从外观、功能、续航三要素看,vivo WATCH智能手表是否值得购买?
  8. tensorflow-gpu测试代码以及版本检测
  9. 新媒体创意设计必备网站,收藏起来
  10. MySQL 常用高可用方案