说明: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