首页 > 代码库 > Android线程

Android线程

说明:android的线程使用。android的线程无非就是Main Thread和Worker Thread。(除了主线程Main Thread之外的其他线程都是Worker Thread)

Main Thread 也叫UI Thread ,绝大部分的UI 代码都运行在主线程的。接下来用几个例子来说明一下。

例子:

1、用户点击Button,开启新的Worker Thread,在Worker Thread里面修改UI(修改TextView的属性)。

package com.example.b_05_thread01;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textViewId);
		button = (Button) findViewById(R.id.buttonId);

		button.setOnClickListener(new ButtonListener());
	}

	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			Thread t = new MyThread();
			t.start();
		}
	}

	// Worker Thread
	class MyThread extends Thread {
		@Override
		public void run() {
			for (int i = 0; i <= 100; i++) {
				try {
					Thread.sleep(1 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				textView.setText("来自于线程的修改");   // 程序会报错,因为只能在主线程中修改ui。
			}
		}
	}
}

运行结果:程序会报错,因为在主线程之外,原则上是不能修改ui的属性。(也有例外,例如ProgressBar)

2、用户点击Button,开启新的Worker Thread,在Worker Thread里面修改UI(修改ProgressBar的属性)。

package com.example.b_05_thread01;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Button button;
	private ProgressBar proBar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textViewId);
		button = (Button) findViewById(R.id.buttonId);
		proBar = (ProgressBar) findViewById(R.id.proBarId);
		button.setOnClickListener(new ButtonListener());
	}

	class ButtonListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			Thread t = new MyThread();
			t.start();
		}
	}

	// Worker Thread
	class MyThread extends Thread {
		@Override
		public void run() {
			for (int i = 0; i <= 100; i++) {
				 try {
				 Thread.sleep(100);
				 } catch (InterruptedException e) {
				 e.printStackTrace();
				 }
				 proBar.setProgress(proBar.getProgress() + 1);
			}
		}
	}
}
运行结果:成功。

3、既然在Worker Thread里面不能修改UI,那么就不需要Worker Thread,所有的事情在Main Thread里面操作,行不行呢?  答案是不行的!

当用户点击Button,不开启新的线程,直接在Main Thread里面休眠。

package com.example.b_05_thread01;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Button button;
	private ProgressBar proBar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textViewId);
		button = (Button) findViewById(R.id.buttonId);
		proBar = (ProgressBar) findViewById(R.id.proBarId);
		button.setOnClickListener(new ButtonListener());
	}

	// 在一个应用程序当中,主线程通常用于接收用户的输入,以及将运算的结果反馈给用户
	// 所以说,对于一些阻塞的操作,必须放置在Worker Thread当中
	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			try {
				Thread.sleep(5 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// Thread t = new MyThread();
			// t.start();
		}
	}

//	// Worker Thread
//	class MyThread extends Thread {
//		@Override
//		public void run() {
//			for (int i = 0; i <= 100; i++) {
//				try {
//					Thread.sleep(100);
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
//				proBar.setProgress(proBar.getProgress() + 1);
//			}
//		}
//	}
}
运行结果:如图。


在一个应用程序当中,主线程通常用于接收用户的输入,以及将运算的结果反馈给用户,所以说,对于一些阻塞的操作,必须放置在Worker Thread当中。

舍长晚安。。。

Android线程