一、Handler是什么?
Handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理的机制,我们可以发送消息,也可以通过它处理消息。
二、为什么要用Handler?
因为Android在设计的时候,就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制,就没有办法更新UI信息,就会抛出异常信息。
三、Handler怎么用呢?
(1)、sendMessage
(2)、sendMessageDelayed
(3)、post(Runnable)
(4)、postDelayed(Runnable,long)
// 使用Handler的sendMessage(message)方法,更新UI主线程。
// 布局文件代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.android.handler_01.MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
// 主程序代码
public class MainActivity extends Activity {
private TextView textView;
Handler handler = new Handler() {
public void handleMessage(Message msg) {
textView.setText("" + msg.arg1);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
new Thread() {
public void run() {
try {
Thread.sleep(2000);
Message message = new Message();
message.arg1 = 88;
handler.sendMessage(message);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}.start();
}
}
// 使用Handler的postDelayed(Runnable,long)方法 实现图片的轮播
// 废话不多说,上代码
// 布局文件代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.android.handler_01.MainActivity" >
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_marginLeft="23dp"
android:layout_marginTop="215dp"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
// 主程序代码
public class MainActivity extends Activity {
private Handler handler = new Handler();
private ImageView imageView;
private int images[] = { R.drawable.gl_new_index_local,
R.drawable.gl_new_index_online, R.drawable.gl_new_index_pic };
private int index;
private MyRunnable myRunnable = new MyRunnable();
class MyRunnable implements Runnable {
@Override
public void run() {
// TODO 自动生成的方法存根
index++;
index = index % 3;
imageView.setImageResource(images[index]);
handler.postDelayed(myRunnable, 1000);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
handler.postDelayed(myRunnable, 1000);
}
}
四、android为什么要设计只能通过Handler机制更新UI呢?
五、Handler的原理是什么?
六、使用Handler时候遇到的问题?
非UI线程中更新UI就会抛出这个异常:
android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
在子线程当中创建一个Handler,程序运行当中就会抛出这样一个异常:
Can't create handler inside thread that has not called Looper.prepare()
七、如何实现一个与线程相关的Handler?
八、HandlerThread又是什么呢?
九、如何在主线程给子线程发送消息呢?
十、android中更新UI的几种方式?
十一、非UI线程真的不能更新UI吗?