`
身心不坚强
  • 浏览: 36842 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

Android开发中线程的复用

阅读更多
项目需要,在socket编程中发送指令的线程应该实现复用,而不是每次点击一次操作就新建一次线程(貌似重复创建线程比较耗资源),因为socket的写操作不是阻塞方法,所以必须用一个死循环来保证线程不被结束,想到利用线程的等待与唤醒模拟阻塞方法的效果。即用户发送指令的时候首先唤醒线程,执行完后就进入等待状态,如此往复。
线程类使用单例模式,使得该线程对象在整个项目中使用同一个对象,即在不同的Activity中都使用同一个线程,实现线程的复用。

经测试该代码可正确实现以上功能

代码:
第一个Activity
package wlx.test.thread;

import wlx.test.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/*
 * 整个项目使用一个发送线程,只创建一次,利用线程的暂停和唤醒实现线程的复用
 */
public class ThreadActivity extends Activity {
	private Button button1 = null;
	private Button button2 = null;
	private Button button3 = null;
	private SendThread sendThread = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		System.out.println("ThreadActivity--->onCreate()");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_thread);
		button1 = (Button) findViewById(R.id.btn_1);
		//listener,唤醒线程
		button1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置数据
				sendThread.setData(new byte[]{1,1});
				//唤醒线程
				sendThread.setNotify();
			}
		});
		
		button2 = (Button) findViewById(R.id.btn_2);
		//listener,进入下一个Activity
		button2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(ThreadActivity.this, OtherActivity.class);
				startActivity(intent);
			}
		});
		
		button3 = (Button) findViewById(R.id.btn_3);
		//listener,结束线程
		button3.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置标志位
				sendThread.setRun(false);
				//设置数据
				sendThread.setData(new byte[]{2,2});
				//唤醒线程
				sendThread.setNotify();
			}
		});
	}
	
	//项目启动的时候就启动发送线程
	private void startSendThread(){
		sendThread = SendThread.getInstance();
	}

	@Override
	protected void onDestroy() {
		System.out.println("ThreadActivity--->onDestroy()");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		System.out.println("ThreadActivity--->onPause()");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		System.out.println("ThreadActivity--->onRestart()");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		System.out.println("ThreadActivity--->onResume()");
		startSendThread();//调用启动线程方法
		super.onResume();
	}

	@Override
	protected void onStart() {
		System.out.println("ThreadActivity--->onStart()");
		super.onStart();
	}

	@Override
	protected void onStop() {
		System.out.println("ThreadActivity--->onStop()");
		super.onStop();
	}
	
	
}



2.第二个Activity
package wlx.test.thread;

import wlx.test.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/*
 * 该Activity可以使用ThreadActivity创建的发送数据线程
 */
public class OtherActivity extends Activity {
	private Button button4 = null;
	private Button button5 = null;
	private SendThread sendThread = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		System.out.println("OtherActivity--->onCreate()");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_thread_other);
		button4 = (Button) findViewById(R.id.btn_4);
		//listener
		button4.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置数据
				sendThread.setData(new byte[]{4,4});
				//唤醒线程
				sendThread.setNotify();
			}
		});
		button5 = (Button) findViewById(R.id.btn_5);
		//listener
		button5.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置标志位
				sendThread.setRun(false);
				//设置数据
				sendThread.setData(new byte[]{5,5});
				//唤醒线程
				sendThread.setNotify();
			}
		});
	}
	
	//得到发送线程
	private void getSendThread(){
		sendThread = SendThread.getInstance();
	}
	
	@Override
	protected void onDestroy() {
		System.out.println("OtherActivity--->onDestroy()");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		System.out.println("OtherActivity--->onPause()");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		System.out.println("OtherActivity--->onRestart()");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		System.out.println("OtherActivity--->onResume()");
		getSendThread();//得到发送线程
		super.onResume();
	}

	@Override
	protected void onStart() {
		System.out.println("OtherActivity--->onStart()");
		super.onStart();
	}

	@Override
	protected void onStop() {
		System.out.println("OtherActivity--->onStop()");
		super.onStop();
	}
}



3.线程类
package wlx.test.thread;

/**
 * 发送消息线程,单例
 * @author Tracy.Lee
 * @version 2012-8-10
 */
public class SendThread extends Thread {
	private static SendThread sendThread;
	private boolean isRun = true;//是否结束线程的标志位
	private byte[] data;//需要发送的字节流
	
	// 构造方法私有化
	private SendThread() {}
	
	// 获得对象 
	public static SendThread getInstance() {
		if (sendThread == null) {
			sendThread = new SendThread();
			sendThread.start();
			System.out.println("新建了一个发送线程");
		}else{
			System.out.println("使用已有的发送线程");
		}
		return sendThread;
	}
	
	@Override
	public void run() {
		try {
			synchronized (this){
				while(isRun){
					System.out.println("线程开始运行");
					wait();
					System.out.println("线程被唤醒");
					System.out.println("发送的数据-->" + data[0] + data[1]);
				}
			}
			System.out.println("线程结束");
			sendThread = null;
		} catch (InterruptedException e) {
			sendThread = null;
			e.printStackTrace();
		}
	}
	
	//唤醒线程
	public synchronized void setNotify() {
		notify();
	}

	public boolean isRun() {
		return isRun;
	}

	public void setRun(boolean isRun) {
		this.isRun = isRun;
	}

	public byte[] getData() {
		return data;
	}

	public void setData(byte[] data) {
		this.data = data;
	}

}


  • 大小: 145.6 KB
分享到:
评论

相关推荐

    Android开发中的多线程编程技术

    资源包中的"Android开发中的多线程编程技术.docx"可能包含各种多线程编程的实例代码和详细解释,有助于深入理解如何在实践中运用多线程技术。 六、Android反汇编工具包 此资源可能包含用于分析和调试Android应用的...

    Android线程结束——合理的结束你想结束的线程

    在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    标题提到的“Android-dialog库”是Android开发中的一个第三方库,它提供了一种灵活的方式,使得开发者能够在任意类中方便地调用Dialog,并且支持在子线程或UI线程内显示,这极大地提高了代码的可复用性和执行效率。...

    Android完美解决ListView复用导致的Checkbox状态混乱问题

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,ListView的复用机制有时会导致一些问题,特别是在涉及复选框(Checkbox)的状态管理时。本篇文章将详细探讨这个问题,并提供一个完美的...

    Android 解决ListView的复用问题 demo

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,由于性能考虑,ListView采用了一种称为“视图复用”的机制来优化显示效率,这就是我们所说的“ListView复用问题”。本demo主要展示了如何...

    Android 线程 多线程 Multi-thread

    在Android开发中,线程和多线程技术是实现应用程序高效运行的关键所在。本篇文章将详细介绍Android线程的基础知识、使用方法及同步机制等内容。 #### 一、Android线程概述 在Android应用开发过程中,线程的应用...

    初中级Android开发社招面试之线程.zip

    在Android开发中,线程管理是一项至关重要的技能,尤其对于初中级开发者来说,理解并熟练掌握线程的应用是提升技术水平的关键。本资料主要围绕“初中级Android开发社招面试之线程”展开,旨在帮助求职者更好地准备...

    Android 组件复用和进程关系

    Intent不仅可以携带数据,还能指定启动组件的方式,如是否创建新的任务栈等,这在组件复用中起着关键作用。 接下来,我们讨论Android的进程模型。每个Android应用都运行在一个独立的Linux进程内,这个进程是与应用...

    android 多任务+多线程+断点下载

    在Android开发中,多任务和多线程是两个重要的概念,尤其在处理大文件下载时,如实现断点续传功能。本项目"android 多任务+多线程+断点下载"旨在演示如何在Android环境中高效、流畅地进行文件下载。 首先,多任务是...

    Android开发艺术探索.pdf

    在Android开发中,性能优化涉及多方面,比如通过合理的布局减少视图层级、使用线程池管理线程、在合适的时机进行垃圾回收等。另外,利用Android Profiler等工具进行性能监控和分析也是优化过程中不可或缺的一环。 #...

    Android开发艺术探索书中源码(任玉刚)

    《Android开发艺术探索》是Android开发者圈子中颇具影响力的一本书,由任玉刚撰写,它深入浅出地探讨了Android应用开发的各种技术和实践。这本书的源码提供了丰富的实例,帮助读者更好地理解和应用书中的理论知识。 ...

    Android中的线程池与任务队列

    在Android开发中,高效地管理线程和任务执行是至关重要的,这关乎到应用的性能、响应速度以及用户体验。线程池和任务队列是实现这一目标的关键工具。本文将深入探讨Android中线程池与任务队列的概念、工作原理以及...

    初中级Android开发社招面试之线程.pdf

    线程在Android开发中扮演着重要的角色,尤其是在处理耗时操作和优化应用程序性能时。面试中,线程池是常见的讨论点,因为它可以帮助开发者更好地管理线程,避免资源浪费和性能瓶颈。 线程池的主要好处在于它能有效...

    李兴华Android 开发实战经典-PPT课件

    《李兴华Android 开发实战经典》PPT课件是一份深入浅出的Android开发教程,旨在帮助开发者从基础知识到实战技巧进行全面学习。Android开发确实是一个庞大且深度丰富的领域,涵盖了操作系统、编程语言、用户界面设计...

    Android多线程处理

    在Android应用开发中,多线程处理是必不可少的技术,它能有效地提高应用程序的性能和用户体验。Android系统本身是基于Linux内核的,因此其多线程机制与传统的Linux多线程相似,但又有针对移动设备特性的优化。下面将...

    Android 多线程下载简单demo之Runnable

    在Android开发中,多线程下载是一个常见的需求,特别是在处理大文件或者为了提高用户体验时,我们需要利用多线程来分块下载数据。本篇将基于`Runnable`接口提供一个简单的多线程下载示例,帮助开发者理解如何在...

    android多线程下载器

    通过实现这个android多线程下载器,你不仅能提升Android开发技能,还能深入了解网络通信、并发编程以及资源管理等多个重要领域。这将对你的Android开发者生涯产生积极影响,帮助你在面对复杂项目时更有信心。

    Android多线程下载器

    在Android开发中,多线程下载器是一种常见且实用的技术,尤其对于大文件的下载,它能显著提高下载效率并优化用户体验。以下是对这个“Android多线程下载器”相关知识点的详细阐述: 1. **多线程概念**:多线程是...

Global site tag (gtag.js) - Google Analytics