项目需要,在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开发中的多线程编程技术资源包 TAG:Android 多线程 应用开发 Alfred整理发布,版权所有!
这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 ...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
在Android开发中,如果我们要执行某个耗时任务,一般都会考虑开启一个线程去处理。 因为我们都知道一个线程run方法执行完毕后,才算真正结束,但是,这只是结束,并没有被回收,会一直闲置在那里,等待GC去回收,...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
低内存消耗的序列帧库,只占用了一张序列帧图片的内存,异步绘制不占用UI线程资源,同时复用序列帧Bitmap,减少内存抖动,避免了频繁的GC,提高动画的流畅性。可用于直播大礼物的展示。
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
SQLite是Android里常用的一种数据存储方式,在访问数据库数据时需要通过SQLiteOpenHelper。 一份好的数据库连接代码应该能解决以下几个问题: a) 构建实例比较费资源 b) 数据库连接最好能复用 c) onUpdate等...
项目中需要用到Curl频繁调用的情况,发现curl接口调用速度缓慢。为了实现curl高性能,高并发,需要研究如何实现高性能高并发。研究方向有三个。 (1) 长连接。考虑采用长连接的方式去开发。首先研究下长连接和短...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
2.2.4. Activity 中四个重要的概念 .. 30 2.3. 旋转屏幕重新加载 Acitivity .......... 33 第 3 章 第三章 ................... 40 3.1. 缓冲界面 ......................................... 40 3.1.1. Demo1 ........
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...
使用多路复用 / 多线程 / 异步网络 IO 模式开发,并发性能优越,支持海量客户端连接。 代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。 支持 linux、macos、ios、android、windows 全平台。 支持画面...
使用多路复用/多线程/异步网络IO模式开发,并发性能优越,支持海量客户端连接。 代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。 支持linux、macos、ios、android、windows全平台。 支持画面秒开、极...