项目需要在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();
- }
- }
- 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();
- }
- }
- 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;
- }
- }