场景:
在程序中如果需要在后台长时间做一件事情,比如联网获取数据等操作,就要用到线程。
但为了提高用户体验,有以下几点需要注意:
1、程序可见时线程开始运行;
2、程序不可见时线程暂停;
3、程序退出时停止线程;
以下根据我自己的程序提出一个公用的代码,大家可以把自己的业务逻辑套进去:
public class NetUtil2 extends Thread {
//NewsBrief为新闻实体类;
private List<NewsBrief> loopList = new ArrayList<NewsBrief>();
private boolean isClose = false;
//IObtainData为一个接口,因为很多程序在用,因此拿Map存储;
private Map<Integer, IObtainData> obtainMap = new HashMap<Integer, IObtainData>();
private int currentPage = 0;
private boolean isPause = false;
private NetUtil2() {
}
private static NetUtil2 single = null;
public synchronized static NetUtil2 getInstance() {
if (single == null) {
single = new NetUtil2();
}
return single;
}
public synchronized void addNewsBrief(NewsBrief newsBrief) {
loopList.add(newsBrief);
//有数据要处理时唤醒线程
this.notify();
}
public void setObtainDataListener(int channelId, IObtainData iod) {
//添加回调
if (!obtainMap.containsKey(channelId)) {
obtainMap.put(channelId, iod);
}
}
public void setCurrentPage(int page) {
currentPage = page;
}
/**
* 暂停线程
*/
public synchronized void onThreadPause() {
isPause = true;
}
/**
* 线程等待,不提供给外部调用
*/
private void onThreadWait() {
try {
synchronized (this) {
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 线程继续运行
*/
public synchronized void onThreadResume() {
isPause = false;
this.notify();
}
/**
* 关闭线程
*/
public synchronized void closeThread() {
try {
notify();
setClose(true);
interrupt();
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean isClose() {
return isClose;
}
public void setClose(boolean isClose) {
this.isClose = isClose;
}
@Override
public void run() {
while (!isClose && !isInterrupted()) {
if (loopList.size() > 0 && !isPause) {
int index = 0;
NewsBrief newsBrief = null;
// 当前页面优先加载
for (int i = 0; i < loopList.size(); i++) {
if (loopList.get(i).getChannelId() == currentPage) {
newsBrief = loopList.get(i);
index = i;
break;
}
}
if (null == newsBrief) {
newsBrief = loopList.get(0);
}
String reslut = getNewsContent(newsBrief);
if (!"-1".equals(reslut)) {
// 获取成功,更新
if (obtainMap.containsKey(newsBrief.getChannelId())) {
obtainMap.get(newsBrief.getChannelId())
.updateNewsBrief(newsBrief);
}
synchronized (loopList) {
loopList.remove(index);
}
} else {
//获取失败,移至队尾
synchronized (loopList) {
NewsBrief nb = loopList.remove(index);
loopList.add(nb);
}
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
onThreadWait();
}
}
}
}
注意:
线程的暂停用isPause控制,说白了其实就是不让线程进入wait状态;
分享到:
相关推荐
线程开启,暂停,恢复,退出操作简易实现demo
android 线程操作进度展示辅助类,非常精简的代码,调用方法执行几行代码即可实现多线程中执行,进度条方式展示的功能。
Android 多线程开发实例,对使用多线程的用户有一定的参考价值!
C#多线程并行管理,通过Task实现,可对单个任务进行暂停,继续以及停止等操作,每个任务均有单独的进度条显示 同时执行的任务个数可以自行设置
下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。 需要注意的问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新...
Android线程操作 handler demo
NULL 博文链接:https://lxl13041491.iteye.com/blog/2167118
文件操作工具类,包含生成保存,复制,删除,读取,获取文件名,获取文件列表等等,只有你想不到,没有你找不到的Android端工具类,复制到项目中可直接使用
鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3鱼刺类_线程操作v4.3
android线程池管理工具类,用来管理线程的一些操作,避免重复new线程造成的资源浪费
易语言模块_模块_线程操作类.rar 易语言模块_模块_线程操作类.rar 易语言模块_模块_线程操作类.rar 易语言模块_模块_线程操作类.rar 易语言模块_模块_线程操作类.rar 易语言模块_模块_线程操作类.rar
介绍四种Android开发多线程的操作方式
现用项目中Sqlite操作类, 1.数据库初始化 2.数据库版本升级 3.从表中查询数据,并返回ArrayList,简单操作不需要建类 4.单一行查询返回、int 返回、string查询返回
C++11关于thead的应用,利用std::condition std::mutex提供如何中断,停止和继续功能,
之前操作sqlite一直用sdk中的SQLiteOpenHelper,在多线程操作数据库(特别是插入数据)的时候,总是提示sqlite已经被锁定,...今天研究了一下android用jdbc操作sqlite,再用多线程去操作数据库的时候就不会有这个状况了
在设计到异步操作时,会遇到用UI线程去操作别的线程暂停、停止等,此demo能够实现这个需求。
易语言源码 国内某知名杀毒软件报毒,介意者请绕道 纯源码,无对应模块,请自行下载模块 _模块_线程操作类
Android系统下,总结4种线程中操作UI界面的方法
黑窗口 多线程 不断输出数据 按键盘暂停继续,很实用。VC6.0.对于初学信号量的人来说很有用。
鱼刺类_线程操作v4.7.5