`
身心不坚强
  • 浏览: 36231 次
  • 性别: 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开发中的多线程编程技术资源包 TAG:Android 多线程 应用开发 Alfred整理发布,版权所有!

    Android开发与应用——张荣,原书配套课件

    这是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课程介绍

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    Android自带的四种线程池使用总结

    在Android开发中,如果我们要执行某个耗时任务,一般都会考虑开启一个线程去处理。 因为我们都知道一个线程run方法执行完毕后,才算真正结束,但是,这只是结束,并没有被回收,会一直闲置在那里,等待GC去回收,...

    【视频6】Android清单文件详解

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    【视频3】Android Studio安裝.avi

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    【视频4】Android Studio工具使用介紹.avi

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    【视频2】移动应用开发-JDK安装

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    Android-低内存消耗的序列帧动画库只占用一张序列帧图片的内存可用于直播大礼物的展示

    低内存消耗的序列帧库,只占用了一张序列帧图片的内存,异步绘制不占用UI线程资源,同时复用序列帧Bitmap,减少内存抖动,避免了频繁的GC,提高动画的流畅性。可用于直播大礼物的展示。

    【视频5】原生安卓项目目录介绍

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    Android中巧妙的实现缓存详解

    SQLite是Android里常用的一种数据存储方式,在访问数据库数据时需要通过SQLiteOpenHelper。 一份好的数据库连接代码应该能解决以下几个问题:  a) 构建实例比较费资源  b) 数据库连接最好能复用  c) onUpdate等...

    libcurl长连接高并发高性能封装测试分析源代码

    项目中需要用到Curl频繁调用的情况,发现curl接口调用速度缓慢。为了实现curl高性能,高并发,需要研究如何实现高性能高并发。研究方向有三个。 (1) 长连接。考虑采用长连接的方式去开发。首先研究下长连接和短...

    【视频7】虚拟机安装使用

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    【视频9】UI线性布局嵌套

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    Android学习系列教程实例.pdf

    2.2.4. Activity 中四个重要的概念 .. 30 2.3. 旋转屏幕重新加载 Acitivity .......... 33 第 3 章 第三章 ................... 40 3.1. 缓冲界面 ......................................... 40 3.1.1. Demo1 ........

    【视频8】UI线性布局

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    【视频10】UI相对布局

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    docker安装zlmediakit一键安装包

    使用多路复用 / 多线程 / 异步网络 IO 模式开发,并发性能优越,支持海量客户端连接。 代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。 支持 linux、macos、ios、android、windows 全平台。 支持画面...

    Docker 安装ZLMediaKit 的安装包

    使用多路复用/多线程/异步网络IO模式开发,并发性能优越,支持海量客户端连接。 代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。 支持linux、macos、ios、android、windows全平台。 支持画面秒开、极...

Global site tag (gtag.js) - Google Analytics