一.Android线程之Handler的简单使用
Android中不允许直接在子线程里直接更改UI界面,因而可以使用Handler从子线程里发送消息到主线程里完成界面的更新.
Handler负责接收消息并通过handleMessage()方法去处理消息同样也肩负着发送消息重担; Message是承载消息的载体,可以设置一些属性如:message.what(设置消息标识),message.obj(任意类型的消息内容); 而Message Queue则用来存放通过Handler发送过来的消息,在主线程开始时会自动创建一个消息队列; Looper循环器与Message相关联,循环从消息队列中取出消息并交付给Handler去处理;
本例是从一个线程里发送Message到主线程里,实时更改UI界面TextView的数据.
MainActivity.java 文件:
package com.example.handler2; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; 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.TextView; import android.os.Build; public class MainActivity extends ActionBarActivity { private TextView tv; private Handler handler1; private int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); tv = (TextView) findViewById(R.id.text1); mythread thread = new mythread(); thread.start(); //处理消息事件 handler1 = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); tv.setText("count = "+msg.obj); } }; } //创建一个进程 class mythread extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); while (true) { try { //延时一秒 Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } //创建消息对象 Message msg = new Message(); //设置消息属性 msg.obj = (count++); //发送消息 handler1.sendMessage(msg); } } } }
二.Android线程之AsyncTask的简单使用
AsyncTask也能实现异步通信,能完成和Handler同样的任务.
AsyncTask有三个泛型参数
Params: 启动任务执行的输入参数
Progress:
后台任务的执行进度
Result:
后台任务最终执行的返回结果
和四个主要回调函数
onPreExecute:
AsyncTask执行了execute()方法后立即执行.
doInBackground:
在onPreExecute方法执行后立即执行,它是运行在单独的线程中执行耗时的操作.
onProgressUpdate: 在doInBackground中调用publishProgress方法后执行,可以将进度信息更新到UI上.
onPostExecute:
后台操作结束时执行,计算结果被作为参数传递进来,可将结果直接显示在UI上.
本例为:点击一个Button,实时更改UI界面TextView的数据.
package com.example.asynctask; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private TextView t1; public int result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); Button bt = (Button) findViewById(R.id.button1); bt.setOnClickListener(new OnClickListener() { private Async task; @Override public void onClick(View arg0) { new Async().execute(0,0, 1); } }); } //AsyncTask三个参数为:第一个为输入参数,即调用excute()方法中传递的参数 // 第二个为子线程执行的百分比,指明onPostExecute的参数类型 // 第三个为result返回值类型 class Async extends AsyncTask<Integer, Integer, String> { // execute被调用后立即执行,一般是对UI界面进行一些标识操作 @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); t1 = (TextView) findViewById(R.id.textView1); t1.setText("onPreExecute()"); } // onPreExecute()完成后执行,一般用于比较费时的操作 @Override protected String doInBackground(Integer... arg0) { // TODO Auto-generated method stub for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } result = arg0[0] + arg0[1] + 1 + result; //publishProgress参数是为下面的onProgressUpdate方法传递的参数 //onProgressUpdate在调用publishProgress时执行,实时更新UI界面信息 publishProgress(result, result + 1); } return result + " 返回值非要String型"; } // 当后台操作结束时调用此方法,将计算结果作为参数传递到方法中,直接在UI界面上显示 @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); t1.setText("最终结果为: " + result); } // 在调用publishProgress时执行,是将进度信息更新到UI上 @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); t1.setText(values[0] + " " + values[1]); } } }