项目需要,在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开发中的多线程编程技术.docx"可能包含各种多线程编程的实例代码和详细解释,有助于深入理解如何在实践中运用多线程技术。 六、Android反汇编工具包 此资源可能包含用于分析和调试Android应用的...
在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...
标题提到的“Android-dialog库”是Android开发中的一个第三方库,它提供了一种灵活的方式,使得开发者能够在任意类中方便地调用Dialog,并且支持在子线程或UI线程内显示,这极大地提高了代码的可复用性和执行效率。...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,ListView的复用机制有时会导致一些问题,特别是在涉及复选框(Checkbox)的状态管理时。本篇文章将详细探讨这个问题,并提供一个完美的...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,由于性能考虑,ListView采用了一种称为“视图复用”的机制来优化显示效率,这就是我们所说的“ListView复用问题”。本demo主要展示了如何...
在Android开发中,线程和多线程技术是实现应用程序高效运行的关键所在。本篇文章将详细介绍Android线程的基础知识、使用方法及同步机制等内容。 #### 一、Android线程概述 在Android应用开发过程中,线程的应用...
在Android开发中,线程管理是一项至关重要的技能,尤其对于初中级开发者来说,理解并熟练掌握线程的应用是提升技术水平的关键。本资料主要围绕“初中级Android开发社招面试之线程”展开,旨在帮助求职者更好地准备...
Intent不仅可以携带数据,还能指定启动组件的方式,如是否创建新的任务栈等,这在组件复用中起着关键作用。 接下来,我们讨论Android的进程模型。每个Android应用都运行在一个独立的Linux进程内,这个进程是与应用...
在Android开发中,多任务和多线程是两个重要的概念,尤其在处理大文件下载时,如实现断点续传功能。本项目"android 多任务+多线程+断点下载"旨在演示如何在Android环境中高效、流畅地进行文件下载。 首先,多任务是...
在Android开发中,性能优化涉及多方面,比如通过合理的布局减少视图层级、使用线程池管理线程、在合适的时机进行垃圾回收等。另外,利用Android Profiler等工具进行性能监控和分析也是优化过程中不可或缺的一环。 #...
《Android开发艺术探索》是Android开发者圈子中颇具影响力的一本书,由任玉刚撰写,它深入浅出地探讨了Android应用开发的各种技术和实践。这本书的源码提供了丰富的实例,帮助读者更好地理解和应用书中的理论知识。 ...
在Android开发中,高效地管理线程和任务执行是至关重要的,这关乎到应用的性能、响应速度以及用户体验。线程池和任务队列是实现这一目标的关键工具。本文将深入探讨Android中线程池与任务队列的概念、工作原理以及...
线程在Android开发中扮演着重要的角色,尤其是在处理耗时操作和优化应用程序性能时。面试中,线程池是常见的讨论点,因为它可以帮助开发者更好地管理线程,避免资源浪费和性能瓶颈。 线程池的主要好处在于它能有效...
《李兴华Android 开发实战经典》PPT课件是一份深入浅出的Android开发教程,旨在帮助开发者从基础知识到实战技巧进行全面学习。Android开发确实是一个庞大且深度丰富的领域,涵盖了操作系统、编程语言、用户界面设计...
在Android应用开发中,多线程处理是必不可少的技术,它能有效地提高应用程序的性能和用户体验。Android系统本身是基于Linux内核的,因此其多线程机制与传统的Linux多线程相似,但又有针对移动设备特性的优化。下面将...
在Android开发中,多线程下载是一个常见的需求,特别是在处理大文件或者为了提高用户体验时,我们需要利用多线程来分块下载数据。本篇将基于`Runnable`接口提供一个简单的多线程下载示例,帮助开发者理解如何在...
通过实现这个android多线程下载器,你不仅能提升Android开发技能,还能深入了解网络通信、并发编程以及资源管理等多个重要领域。这将对你的Android开发者生涯产生积极影响,帮助你在面对复杂项目时更有信心。
在Android开发中,多线程下载器是一种常见且实用的技术,尤其对于大文件的下载,它能显著提高下载效率并优化用户体验。以下是对这个“Android多线程下载器”相关知识点的详细阐述: 1. **多线程概念**:多线程是...