android的应用程序支持多线程,多线程编程为我们充分利用系统资源提供了便利,同时也为设计复杂UI和耗时操作提供了途径,提升了安卓用户的使用体验。Android的多线程和JAVA没有多大变化,唯一的变化大概在于无法直接使用CANVAS修改屏幕元素,当然安卓为我们提供了surfaceview类来实现多线程中通过画布canvas修改屏幕。这为设计UI和开发游戏带来了方便。因此,研究和使用多线程编程,对我们深入学习安卓编程有着十分重要的作用。
线程的方法比较多,常用的有:
start();
run();
sleep();
stop();
destroy();
join();
suspend();
resume();
yield();
wait();notify();
线程启动一定要使用start方法,线程操作使用run方法,线程休眠使用sleep方法,线程停止使用stop,线程销毁使用destroy方法,线程同步使用JOIN方法,前面三种最常用,一般来说这三种就可以满足大部分线程使用需求,run结束时线程自动死亡,stop,destroy虽然也能停止线程,但不推荐使用,,前者会产生异常,后者是强制终止,不会释放锁,一般会在RUN里设置一个状态信号来等其自动结束,这里使用volatile boolean bThreadRun。后面是暂停,继续,挂起,由于会产生死锁问题,很少使用。大部分情况会使用wait和notify替代;
这里我使用一个线程来计算变量并更新窗口标题。主要代码如下:使用eclipse创建一个项目。为Activity添加onStart,onPause, onStop等方法,Activity是我们最常使用的一个类,也是android的核心类,为应用程序管理并显示一个屏幕,开发的人不应该对其陌生。Activity活动主要的方法有,onCreate,onStart,onStop,onPause,onResume, onRestart,onDestroy,onRestoreInstanceState,onSaveInstanceState,一般的执行顺序是,onCreate,onStart,onResume,当窗口不是最顶层时,执行onPause,onstop,为顶层时,执行onRestart,onResume,一直循环,直到onDestroy.如果保存窗口,重载onSaveInstanceState,并在进入时重载onRestoreInstanceState。这里我在Activity的方法onStart里创建线程:
MyThread myThread = new MyThread();
myThread.start();
在下面添加MyThread的实现代码:
public class MyThread extends Thread {
// 声明字符串变量
public MyThread() {
}
@Override
public void start() {
super.start();
}
// 线程的主要工作方法
@Override
public void run() {
while (true) {
try {
sleep(5000);
if (c > ((1 << 31) - 1)) {
c = 0;
} else {
c++;
}
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
} catch (InterruptedException ex) {
}
}
}
}
实现updatetitle方法:
public void updateTitle() {
setTitle("test thread " + c);
}
这里没有使用updatetitle直接更新窗口,而是使用handler,这是因为直接使用是不安全的,会造成线程重启等问题。Android 引进了Handler 这个特殊的类,用它作为Runnable和Activity交互的桥梁,所以我们只能在run方法中发送Message,而在Handler里,通过不同的Message执行不同的任务。为程序添加handler;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
updateTitle();
break;
}
};
};
最后完整的代码如下,使用线程处理数据,并把数据显示在窗口上:
package com.test;
import android.app.Activity;
import android.os.Bundle;
import java.lang.Thread;
import android.os.Message;
import android.os.Handler;
import android.graphics.Color;
public class TestThreadActivity extends Activity {
int c = Color.BLUE;
MyThread myThread;
volatile boolean bThreadRun = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onRestoreInstanceState(android.os.Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(android.os.Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onStart() {
super.onStart();
myThread = new MyThread();
myThread.start();
bThreadRun = true;
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
bThreadRun = false;
// myThread.stop();
}
@Override
protected void onStop() {
super.onStop();
onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
// myThread.destroy();
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
updateTitle();
break;
}
};
};
public void updateTitle() {
setTitle("test thread " + c);
setTitleColor(c);
}
public class MyThread extends Thread {
// 声明字符串变量
public MyThread() {
}
@Override
public void start() {
super.start();
}
// 线程的主要工作方法
@Override
public void run() {
while (bThreadRun) {
try {
sleep(100);
if (c > ((1 << 16) - 1)) {
c = 0;
} else {
c += 100;
}
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
} catch (InterruptedException ex) {
}
}
}
}
}
线程还有另外一种常用的方法是编写Runnable接口,这里对代码做一些修改,使用线程实现对主窗口重绘,全部代码如下:
package com.test;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import java.lang.Thread;
import android.view.View;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
public class TestThreadActivity extends Activity {
int c = Color.BLUE;
MyThread myThread;
volatile boolean bThreadRun = false;
MyView mv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
mv = new MyView(this);
setContentView(mv);
}
public class MyView extends View {
MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// 首先定义一个paint
Paint paint = new Paint();
// 绘制矩形区域-实心矩形
// 设置颜色
paint.setColor(c);
// 设置样式-填充
paint.setStyle(Style.FILL);
// 绘制一个矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
}
}
@Override
protected void onRestoreInstanceState(android.os.Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(android.os.Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onStart() {
super.onStart();
//myThread = new MyThread();
//myThread.start();
new Thread (new MyThread()).start();
bThreadRun = true;
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
bThreadRun = false;
// myThread.stop();
}
@Override
protected void onStop() {
super.onStop();
onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
// myThread.destroy();
}
public class MyThread implements Runnable{
// 线程的主要工作方法
@Override
public void run() {
while (bThreadRun) {
try {
Thread.sleep(500);
if (c > ((1 << 31) - 1)) {
c = 0;
} else {
c += 100;
}
mv.postInvalidate();
} catch(InterruptedException e){
}
}
}
}
}
参考博客:
http://blog.csdn.net/Android_Tutor/article/details/5568806