Android 多线程编程

原创 2012年03月27日 22:28:30

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




相关文章推荐

Android编程之Listener侦听的N种写法及实现原理

写下这个题目时突然想起鲁迅笔下的孔乙已,茴香豆的几种写法,颇有些咬文嚼字的味道。虽然从事手机编程多年,但一直使用的是C和C++编程,由于安卓早期只支持JAVA开发,所以对于时下如火如荼的安卓系统,我一...
  • blogercn
  • blogercn
  • 2012年03月26日 15:32
  • 20592

android 自定义监听的方式回传数据

需求:要自定义一个popupwindow,里面有个listview,我要将listview点击的条目信息回传给activity,当然方法很多,我是通过自定义监听回传的方式。 popupwindow的...

老罗android视频多线程编程源码

  • 2015年08月07日 10:24
  • 11.85MB
  • 下载

Android开发中的多线程编程技术

  • 2012年07月25日 16:58
  • 1.48MB
  • 下载

Android 多线程编程

Android 多线程编程 主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做。子线程不能更新控件的内容(更新Ui)。所以产生了矛盾,解决办法就是使用Handler. Android...
  • xfhy_
  • xfhy_
  • 2017年04月27日 07:33
  • 211

Android开发中的多线程编程技术

  • 2012年12月05日 13:25
  • 486KB
  • 下载

Android 多线程编程的总结

前言 这几天在研究Android的多线程方面的知识,阅读了许多大牛的文章,发现Android的多线程方式挺多的,关于各种方式的优缺点也都各有看法,所以这部分的知识还是很容易令人觉得混乱的,所以自...

Android 多线程编程

点击打开链接 android的应用程序支持多线程,多线程编程为我们充分利用系统资源提供了便利,同时也为设计复杂UI和耗时操作提供了途径,提升了安卓用户的使用体验。Android的多线...
  • life02
  • life02
  • 2012年05月11日 21:22
  • 412

Android多线程编程(异步通信)--->Handler和AsyncTask

Handler机制:1)主线程UI:本身就有一个Looper机制,其中有Handler,中包含了消息队列MessageQueen:2)UI线程模型:UI主线程不允许其他线程操作组件,只有UI主线程能够...

Android开发中的多线程编程技术

多线程这个令人生畏的“洪水猛兽”,很多人谈起多线程都心存畏惧。在Android开发过程中,多线程真的很难吗?多线程程序的“麻烦”源于它很抽象、与单线程程序运行模式不同,但只要掌握了它们的区别,编写多线...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 多线程编程
举报原因:
原因补充:

(最多只允许输入30个字)