您的位置:首页 > 移动开发 > Android开发

android_线

2015-08-12 18:32 597 查看
说明:android螺纹。

android无非就是一个线程Main Thread和Worker Thread。(除了主线程Main Thread是Worker Thread)

Main Thread 也叫UI Thread 。绝大部分的UI 代码都执行在主线程的。

Worker Thread 通常完毕耗时较长、会产生堵塞的操作,比如訪问网络、进行大量IO的读写。

接下来用几个样例来说明一下。

样例:

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其中。



欢迎交流 http://blog.csdn.net/ycwol/article/details/39900371
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: