Android面试常客Handler详解

一、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吗? 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值