Android TimerTask定时任务卡顿

现象描述

Android中使用Timer开启TimerTask定时任务,若TimerTask任务过于繁重,容易造成卡顿、重复及跳变现象

解决方案

开辟新线程,减轻TimerTask工作量。如定时数据采集存储,将数据采集放在定时任务中,并将数据存储放在新开辟的线程中,线程间采用Handle/Message通信机制。

为减少Handler的维护工作,可采用内置Handler的HandlerThread

mDataSaveThread = new HandlerThread("data_save");
mDataSaveThread.start();
mDataSaveHandler = new Handler(mDataSaveThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        Data data = (Data) msg.obj;
        try {
            mDataStringBuilder.delete(0, mDataStringBuilder.length());
            mDataStringBuilder.append...;
            mBufw.write(mDataStringBuilder.toString());
            mBufw.newLine();
            mBufw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
};

mTimer = new Timer();
if (mTimerTask == null) {
    mTimerTask = new TimerTask() {
        @Override
        public void run() {
            mCount++;
            Data data = new Data();
            data.count = mData.count = mCount;
            data.datetime = mData.datetime = getMilliDateTime();

            ...

            Message msg = mDataSaveHandler.obtainMessage();
            msg.what = 0;
            msg.obj = data;
            mDataSaveHandler.sendMessage(msg);
        }
    };
    mTimer.scheduleAtFixedRate(mTimerTask, 1000, PERIOD);
}
上一篇 Android代码设置EditText的hint字体大小而不改变EditText的字体大小
下一篇 Android设置ImageView图片灰度
目录
文章列表
1 设计模式(23)外观模式
设计模式(23)外观模式
2
Shell替换字符串的几种方法:变量替换,sed,awk
Shell替换字符串的几种方法:变量替换,sed,awk
3
MathJax基础之Array或Table
MathJax基础之Array或Table
4
Google Guava工具类的介绍和使用
Google Guava工具类的介绍和使用
5
Spring Cloud Gray 管控端界面使用手册
Spring Cloud Gray 管控端界面使用手册
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。