`

Android线程操作类(暂停、重新开启、停止)

 
阅读更多
场景:
在程序中如果需要在后台长时间做一件事情,比如联网获取数据等操作,就要用到线程。
但为了提高用户体验,有以下几点需要注意:
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状态;
1
0
分享到:
评论

相关推荐

    android 线程暂停/恢复/退出demo

    在Android开发中,多线程是必不可少的一部分,特别是在处理耗时任务时,如网络请求、数据库操作或大计算量的任务。...通过实践这个“android 线程暂停/恢复/退出demo”,开发者可以加深对Android线程管理的理解。

    Android多线程断点下载可暂停和继续

    当用户选择暂停某个任务时,可以向对应的线程发送停止信号,同时更新任务状态;当用户决定继续时,根据任务状态启动相应线程,从上次停下的位置继续下载。 在`com.dshine.app.download.DownloadActivity`这个类中,...

    Android用线程实现ImageView图片变换+可以停止和继续

    这个主题“Android用线程实现ImageView图片变换+可以停止和继续”主要关注如何利用线程技术来实现图片的动态变换,并且提供了暂停和继续的功能。这涉及到以下几个关键知识点: 1. **线程**:Android主线程(UI线程...

    Android——显示时间和暂停时间(Handler类操作线程)

    `Handler`类是Android中处理消息和线程交互的核心工具,它允许我们在主线程中执行特定的操作,比如更新UI,而这些操作通常由工作线程触发。本篇文章将深入探讨如何利用`Handler`来实现显示和暂停时间的功能。 `...

    Android多线程下载(二)

    总之,Android多线程下载涉及到了Android线程模型、并发控制、文件操作等多个方面,需要开发者有扎实的基础知识和实践经验。通过合理利用多线程,不仅可以提升应用性能,还能提高用户满意度。在实际开发中,要根据...

    android多线程下载

    在Android开发中,多线程下载是一项常见的任务,特别是在处理大文件时,为了提高用户体验,通常需要实现下载的暂停、断点续传功能。本文将深入解析如何在Android环境中实现这样的功能。 首先,理解“多线程下载”的...

    Java/Android关于线程使用的总结

    ### Java/Android线程使用深度解析 在计算机科学领域,线程与进程是核心概念,尤其是在多任务操作系统中。本文将深入探讨Java/Android环境下的线程管理,包括线程的创建、线程池的利用及`ThreadHandler`的运用等...

    Android多线程断点文件下载和暂停源码

    本文将深入探讨Android平台下的多线程断点文件下载和暂停功能的实现原理及源码分析。 首先,我们需要理解多线程的概念。在单线程环境中,程序执行是顺序的,如果一个任务耗时较长,那么整个应用程序将被阻塞。多...

    Android多线程文件夹下载及断点续传

    在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...

    android java 多线程下载工具类调用一个方法即可

    在Android开发中,多线程下载是常见的网络操作,它能提高下载效率,尤其是在处理大文件时。这个“android java 多线程下载工具类”应该是为了简化这一过程而设计的,通过调用一个方法就能实现多线程下载功能。下面...

    android 多线程下载demo

    Android提供了`FileInputStream`和`FileOutputStream`等文件操作类,用于读取和写入文件,实现各部分的合并。 5. **存储管理**:在Android中,需要考虑存储权限和存储位置的选择,例如外部存储(`Environment....

    Android实现多线程下载

    Android提供了`AsyncTask`类,方便开发者执行轻量级的异步操作。然而,对于多线程下载这样的重度任务,`AsyncTask`可能不是最佳选择,因为它有自己的线程池限制,且不适用于长时间运行的任务。因此,我们通常会使用...

    Android线程使用实例

    在Android开发中,线程的使用是至关重要的,因为Android系统对主线程(UI线程)的执行有严格的限制,防止长时间运行的操作阻塞用户界面。本实例将深入讲解如何在Android Studio中创建和管理线程,以实现一个秒表功能...

    android studio多线程下载

    在Android开发中,多线程下载是一项常见的技术,特别是在处理大文件或网络资源时,为了提高下载速度和用户体验,开发者通常会采用多线程来分块下载数据。Android Studio作为官方推荐的Android集成开发环境,提供了...

    Android多线程PPT教学课件.pptx

    **异步任务和AsyncTask**\n除了使用自定义线程和Handler,Android还提供了`AsyncTask`类,它是一个轻量级的异步任务框架,适合处理短时间的后台操作,如网络请求。`AsyncTask`具有简单的API,支持在后台执行任务并...

    android 多线程下载机制

    3. **线程创建**:Android提供了多种创建线程的方式,如`Thread`类的直接实例化、`AsyncTask`、`Handler`和`Looper`配合使用,以及`IntentService`等。 ### 二、多线程下载原理 1. **文件分割**:首先,我们需要将...

    Android 多线程下载进度条src 支持android 1.6以上

    在Android中,由于主线程(UI线程)不允许进行耗时操作,因此,文件下载通常需要在后台线程执行。可以使用`AsyncTask`、`Thread`或`ExecutorService`来创建新线程。多线程下载则可以将大文件分割成多个小部分,同时...

    android多线程下载文件

    总之,这个Android多线程断点续传下载器项目涵盖了Android开发中的许多关键知识点,包括多线程编程、文件操作、网络请求、服务、数据持久化以及用户界面更新等,对于提升Android开发技能具有很高的实践价值。...

    android 多线程断点下载 (ListView 模式)

    设计一个下载管理器类,它负责管理所有下载任务,包括启动、暂停、取消等操作。下载管理器需要维护一个任务队列,并且要有线程安全的机制,确保多线程环境下数据的一致性。 5. **文件分块与合并** 在下载过程中,...

    Android多线程断点续传下载器

    当用户重新启动下载时,应用会检查本地存储的元数据,然后从上次停止的地方继续下载。 3. **HTTP协议**: HTTP是互联网上应用最广泛的一种协议,用于传输超文本。在下载场景中,客户端(Android应用)向服务器发送...

Global site tag (gtag.js) - Google Analytics