Android线程1 Handler处理更新UI子线程问题

来源:互联网 发布:java实现密钥进行加密 编辑:程序博客网 时间:2024/05/15 15:28

我们知道,每个eActivity都有一个Main线程,也称之为UI线程,当在子线程中更新UI线程中的元素就会出现Crash。

解决方式就是通过handler解决。现在上代码,demo很简单,使用子线程更新Textview显示从update_0到update_49。

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    private TextView text;    private static final int UPDATE_TEXTVIEW = 1;    private Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case UPDATE_TEXTVIEW:                    String update_text = (String)msg.obj;                    text.setText(update_text);                    break;                default:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView)findViewById(R.id.text);        new Thread(new Runnable() {            @Override            public void run() {                for(int i=0;i<50;i++){                    String update_text = "update_"+i;                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    //Message.obtain()                    Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();                    /*Message message = new Message();                    message.what = UPDATE_TEXTVIEW;                    message.obj = update_text;                    handler.sendMessage(message);*/                }            }        }).start();    }}

编程方法:
第一步:创建Handler,如下。Handler主要是为了处理消息用的,在消息回环中更新UI线程元素。

private Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case UPDATE_TEXTVIEW:                    String update_text = (String)msg.obj;                    text.setText(update_text);                    break;                default:                    break;            }        }    };

第二步骤:创建消息对象,并send到Handler Target。此处方法很多:
1,Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();

2,Message message = new Message();
message.what = UPDATE_TEXTVIEW;
message.obj = update_text;
handler.sendMessage(message);
但是看看API官网中Mesaage 构造函数:
Message()
Constructor (but the preferred way to get a Message is to call Message.obtain()).
推荐使用obtain方法。

3,有一种很简洁的方式更新UI线程元素,就是直接使用Handler.post(Runnable)。这样就可以不建立消息Message对象进行更新。此种方式的代码如下所示:

public final boolean post (Runnable r)Added in API level 1Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.Parametersr   The Runnable that will be executed.ReturnsReturns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView)findViewById(R.id.text);        new Thread(new Runnable() {            @Override            public void run() {                for(int i=0;i<50;i++){                    final String update_text = "update_"+i;                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    //Message.obtain()                    //Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();                    /*Message message = new Message();                    message.what = UPDATE_TEXTVIEW;                    message.obj = update_text;                    handler.sendMessage(message);*/                    handler.post(new Runnable() {                        @Override                        public void run() {                            text.setText(update_text);                        }                    });                }            }        }).start();    }

代码地址在:
http://download.csdn.net/detail/zhangkai1992/9602339

0 0