xml文件:
<LinearLayout 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:orientation="vertical" tools:context="com.example.handler.MainActivity" > <ProgressBar android:id="@+id/progressBar" android:layout_width="200dp" android:layout_height="wrap_content" android:visibility="gone" style="?android:attr/progressBarStyleHorizontal" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start" android:textSize="20sp"/> </LinearLayout>
源代码:
main1:
package com.example.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; /** * Handler:安卓提供的异步线程处理方式 * * Handler的使用 * 创建一个Handler对象 * 调用Handler的post方法,将要执行的线程对象添加到队列当中 * 将要执行的操作写在线程对象当中 * 在Run方法内部执行postDelayed或者post方法实现循环 * *分析:调用post方法,将要执行的线程对象或消息对象添加到队列当中,然后该方法return, * Handler中HanderMessage负责接收消息队列中的消息, * 从而实现异步处理,互不影响 */ /** * 例程: * 利用Handler处理一个进度条 * @author Administrator * */ public class MainActivity extends Activity implements OnClickListener,Runnable { private Button button; private ProgressBar progressBar ; private Thread thread; private int i = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); progressBar = (ProgressBar) findViewById(R.id.progressBar); button.setOnClickListener(this); thread = new Thread(this); thread.start(); } @Override public void onClick(View v) { // TODO Auto-generated method stub progressBar.setVisibility(i); handler.post(thread);//将线程对象加入到线程对象当中 } //使用匿名内部类来复写Handler当中的handlerMessage方法 Handler handler = new Handler(){ //接收消息队列中的消息 public void handleMessage(Message msg) { progressBar.setVisibility(msg.arg1); handler.post(thread); System.out.println(handler+"....."+Thread.currentThread().getName()); }; }; @Override public void run() { // TODO Auto-generated method stub System.out.println("Thread.........."+Thread.currentThread().getName()); i = i+10; //得到一个消息对象,Message类是由安卓操作系统提供 Message msg = handler.obtainMessage(); //将msg对象的arg1参数设置为i,用arg1和arg2成员变量传递消息,优点是新系统性能消耗较少 msg.arg1 = i; try { //设置当前线程休眠1S thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将消息对象加入到消息队列中 handler.sendMessage(msg); if(i==100){ //在Handler中移除当前线程 handler.removeCallbacks(thread); } } }
main2:
package com.example.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; /** * 为了避免启动一个活动处理事件的时间过长导致该活动没有响应,一般我们处理数据量比较大的数据时,会将其分别放置在几个线程里面,实现异步处理数据 * @author Administrator * */ public class MainActivity2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); System.out.println("activity-->"+Thread.currentThread().getName()); //生成了一个handlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由安卓应用程序框架提供 //looper会循环从队列中取出消息 HandlerThread handlerThread = new HandlerThread("handler_thread"); //在使用handlerThread.getLooper()方法之前必须先开启线程 handlerThread.start(); //将Handler通过getLooper方法绑定在了调用Looper的线程上 MyHandler handler = new MyHandler(handlerThread.getLooper()); Message msg = handler.obtainMessage(); Bundle data = new Bundle(); data.putString("name", "zhangsan"); data.putInt("age", 20); msg.obj = "abc"; msg.setData(data); //将msg发送到目标对象,所谓的目标对象就是生成该msg对象的handler对象 msg.sendToTarget(); } } class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); String obj = (String) msg.obj; Bundle data = msg.getData(); String name = data.getString("name"); int age = data.getInt("age"); System.out.println(name+"::"+age); System.out.println("handler-->"+Thread.currentThread().getName()); } }