Android中多线程编程:Handler类、Runnable类、Thread类之概念分析
1.Handler类:
Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理。Handler是执行在主线程(UI线程)。
(2).使用Handler机制的原因:
这是谷歌封装的一种更新UI机制和消息机制。假设不使用这个来更新UI和发送处理消息的时候就会抛出异常。
(3).Handler的使用:
Handler发送消息事实上是发送给自己。也就是说由自己来进行发送和处理。是由于Handler内部和Looper相关联。
A.更新UI界面方面:
package com.chengdong.su.handlerdemo;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.os.Build;
/**
* Handler用途1:更新UI界面中的组件
*
* @author scd
*
*/
public class MainActivity extends Activity {
private ImageView mView;
/** 数据源 */
private int[] mImage = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3 };
/** 图片所在的位置 */
private int mIndex = 0;
/** the object of the Handler */
private Handler mHandler = new Handler();
/** the object of the Runnable */
private MyRunnable mRunnable = new MyRunnable();
Runnable runnable = new Runnable() {
@Override
public void run() {
mIndex++;
mIndex = mIndex % 3;
mView.setImageResource(mImage[mIndex]);
// 再次调用Runnable对象,每隔一秒钟调用一次run()方法
mHandler.postDelayed(runnable, 1000);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
init();
// 方法一:
// mHandler.postDelayed(runnable, 1000);
// 方法二:自己定义Runnable对象
mHandler.postDelayed(mRunnable, 1000);
}
/***
* init the view
*/
private void init() {
mView = (ImageView) findViewById(R.id.imageView1);
}
/**
* 任务:业务逻辑
*
* @author scd
*
*/
private class MyRunnable implements Runnable {
@Override
public void run() {
mIndex++;
mIndex = mIndex % 3;
mView.setImageResource(mImage[mIndex]);
// 再次调用Runnable对象,每隔一秒钟调用一次run()方法
mHandler.postDelayed(mRunnable, 1000);
}
}
}
B.消息处理方面:
package com.chengdong.su.handlerdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;
/**
* Handler用途1:更新UI界面中的组件
*
* @author scd
*
*/
public class MainActivity extends Activity {
private String TAG = "MainActivity";
private boolean Flag;
private ImageView mView;
/** the object of the Handler */
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0: {
mView.setImageResource(R.drawable.ic_1);
Log.d(TAG, "消息1");
break;
}
case 1: {
mView.setImageResource(R.drawable.ic_2);
Log.d(TAG, "消息2");
break;
}
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
init();
if (Flag) {
mHandler.sendEmptyMessage(0);
} else {
mHandler.sendEmptyMessage(1);
}
}
/***
* init the view
*/
private void init() {
mView = (ImageView) findViewById(R.id.imageView1);
}
}
2.Runnable类:
Runnable类是在UI线程中执行的,并没有创建新的线程。Runnable类是一个接口,通过覆写该类中的run()方法来实现业务逻辑需求。
来更新UI界面中的组件。Runnable类仅仅是一个任务接口。是开启的线程的执行的任务。
3.Thread类:
实现Runnable类中的run()方法,Thread类调用该run()方法来执行新开启的线程,线程须要执行的内容都在该run()方法中来完毕。
(1).start()方法:该方法启动一个线程。
可是此线程是处于就绪状态,并没有执行。然后通过Thread系统类自己主动调用run()方法来完毕执行操作。
(2).run()方法:该方法成为线程体。包括了要执行的线程的内容。run()方法执行结束,此线程终止。
package com.chengdong.su.handlerdemo;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;
/**
*
* @author scd
*
*/
public class SecondActivity extends Activity {
private String TAG = getClass().getSimpleName();
private TextView mView;
private MyThread mThread;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
Log.d(TAG, "Thread UI:" + Thread.currentThread().getId());
mView.setText("111");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
System.out.println("--->UI线程:" + Thread.currentThread().getId());
// 方法一:
new Thread() {
public void run() {
System.out
.println("--->新的线程:" + Thread.currentThread().getId());
};
}.start();
// 方法二:
new Thread(new Runnable() {
@Override
public void run() {
System.out
.println("--->新的线程:" + Thread.currentThread().getId());
}
}).start();
}
private void init() {
mView = (TextView) findViewById(R.id.textView1);
}
class MyThread extends Thread {
public Handler mHandler2;
@Override
public void run() {
// 创建一个消息载体对象
Looper.prepare();
mHandler2 = new Handler() {
public void handleMessage(android.os.Message msg) {
Toast.makeText(getApplicationContext(), "111", 1).show();
};
};
// 循环机制
Looper.loop();
}
}
}
总结:
Runnable()仅仅是一个任务的抽象,并非多线程。Thread.start()才是新开一个多线程。而且在新开的线程执行Thread。执行run()方法。多线程是Thread实现,跟Runnable没有太大关系。线程就是为了更好地利用CPU,提高程序执行速率的。