android中handler的使用之一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中handler的使用之一相关的知识,希望对你有一定的参考价值。

 handler是安卓中用于消息传递的机制,通常用于ui线程的更新。我们知道,子线程即非UI线程是不能更新ui的,因此这个得让handler大显神威。

例如下面就是一个简单的子线程的更新的ui的事例,记住:下面的事例是错误的

xml代码:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.example.android_handler1.MainActivity" >
10 
11     <TextView
12         android:id="@+id/textview"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:text="@string/hello_world" />
16 
17 </RelativeLayout>

 

java代码:

 1 package com.example.android_handler1;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.widget.TextView;
 6 
 7 public class MainActivity extends Activity {
 8     private TextView textview = null;
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13         textview = (TextView) findViewById(R.id.textview);
14         new Thread(){
15             public void run() {
16                 try {
17                     Thread.sleep(1000);
18                 } catch (InterruptedException e) {
19                     // TODO Auto-generated catch block
20                     e.printStackTrace();
21                 }
22                 textview.setText("updata");
23             };
24         }.start();
25     }
26 
27 }

当我们运行起这段代码后,会发现程序会闪退,错误的原因就在于子线程去更新了ui,这时错误的做法。通常我们使用handler来通知主线程即ui线程来更新ui。

因此我们只需把代码改成这样就行:

 1 package com.example.android_handler1;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.widget.TextView;
 7 
 8 public class MainActivity extends Activity {
 9     private TextView textview = null;
10     private Handler handler = new Handler();
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_main);
15         textview = (TextView) findViewById(R.id.textview);
16         new Thread(){
17             public void run() {
18                 //利用handler来传递一个post,让主线程来更新ui
19                 handler.post(new Runnable() {
20                     
21                     @Override
22                     public void run() {
23                         // TODO Auto-generated method stub
24                         try {
25                             Thread.sleep(1000);
26                         } catch (InterruptedException e) {
27                             // TODO Auto-generated catch block
28                             e.printStackTrace();
29                         }
30                         textview.setText("updata");
31                     }
32                 });
33 
34             };
35         }.start();
36     }
37 
38 }

 

以上是关于android中handler的使用之一的主要内容,如果未能解决你的问题,请参考以下文章

什么时候可以在android中使用强引用,这个代码是否泄漏?

Android第一行代码--Service(四大组件之一)

Android第一行代码--Service(四大组件之一)

Android第一行代码--Service(四大组件之一)

Android第一行代码--Service(四大组件之一)

金蝶handler中 collection 代码片段理解