Android TimerTask定时任务卡顿

现象描述

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

解决方案

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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);
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :