Android学习笔记-Handler的使用
点击Start按钮,每隔3秒在Logcat里打印一句话
<Buttonandroid:id="@+id/startButton"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Start"/><Buttonandroid:id="@+id/endButton"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@id/startButton"android:text="End"/>
MainActivity.java
publicclassMainActivityextendsActionBarActivity{privateButtonstartButton=null;privateButtonendButton=null;Handlerhandler=newHandler();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startButton=(Button)findViewById(R.id.startButton);endButton=(Button)findViewById(R.id.endButton);startButton.setOnClickListener(newStartButtonListener());endButton.setOnClickListener(newEndButtonListener());}classStartButtonListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){handler.post(updateThread);}}classEndButtonListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){handler.removeCallbacks(updateThread);}}RunnableupdateThread=newRunnable(){@Overridepublicvoidrun(){System.out.println("updateThread");handler.postDelayed(updateThread,3000);}};}
点击Start按钮之后每隔11000毫秒进度条增加10%
界面activity_main.xml
<ProgressBarandroid:id="@+id/bar"android:layout_width="200dp"android:layout_height="wrap_content"android:visibility="gone"/><Buttonandroid:id="@+id/startButton"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@id/bar"android:text="Start"/>
MainActivity.java
publicclassMainActivityextendsActionBarActivity{privateProgressBarbar=null;privateButtonstartButton=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bar=(ProgressBar)findViewById(R.id.bar);startButton=(Button)findViewById(R.id.startButton);startButton.setOnClickListener(newButtonListener());}//当点击StartButton按钮时就会执行ButtonListener的onClick方法classButtonListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){System.out.println("Onclick");Toast.makeText(MainActivity.this,"Onclick",Toast.LENGTH_SHORT).show();bar.setVisibility(View.VISIBLE);updateBarHandler.post(updateThread);}}//使用匿名内部类来复写Handler当中的handleMessage方法HandlerupdateBarHandler=newHandler(){publicvoidhandleMessage(android.os.Messagemsg){bar.setProgress(msg.arg1);updateBarHandler.post(updateThread);};};//线程类,使用匿名内部类的方式进行声明RunnableupdateThread=newRunnable(){inti=0;@Overridepublicvoidrun(){System.out.println("BeginThread");i=i+10;//得到一个消息对象。Message类是由Android操作系统提供。Messagemsg=updateBarHandler.obtainMessage();//使用arg1和arg2这两个成员变量传递消息,优点是节省系统资源msg.arg1=i;try{//设置当前线程睡眠一秒Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}//将msg加入到消息队列当中updateBarHandler.sendMessage(msg);if(i==100){System.out.println("i==100");updateBarHandler.removeCallbacks(updateThread);}}};}
可以看到处理消息的线程和主线程是同一个线程
publicclassMainActivityextendsActionBarActivity{privateHandlerhandler=newHandler();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);handler.post(runnable);/*如果采用这种方式则会创建新的线程Threadthread=newThread(runnable);thread.start();*/setContentView(R.layout.activity_main);//要等10秒钟才显示System.out.println("Activity:"+Thread.currentThread().getId());System.out.println("ActivityName:"+Thread.currentThread().getName());}//上面打印的信息和下面打印的信息是一样的//Handler处理线程的时候并没有创建新的线程Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("Handler:"+Thread.currentThread().getId());System.out.println("HandlerName:"+Thread.currentThread().getName());try{Thread.sleep(10000);}catch(Exceptione){}}};}
在新的线程中处理消息,真正实现异步消息处理
publicclassMainActivityextendsActionBarActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//打印当前线程的IDSystem.out.println("MainActivity>>>"+Thread.currentThread().getId());//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能HandlerThreadhandlerThread=newHandlerThread("handler_Thread");handlerThread.start();MyHandlermyHandler=newMyHandler(handlerThread.getLooper());Messagemsg=myHandler.obtainMessage();//msg.obj="abc";//简单数据Bundlebundle=newBundle();bundle.putInt("age",20);bundle.putString("name","umgsai");msg.setData(bundle);//将msg发送到目标对象,即生成msg对象的Handler对象msg.sendToTarget();}classMyHandlerextendsHandler{publicMyHandler(){}publicMyHandler(Looperlooper){super(looper);}@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);//Strings=(String)msg.obj;//取出数据Bundlebundle=msg.getData();System.out.println("age:"+bundle.getInt("age")+",name:"+bundle.getString("name"));System.out.println("Handler>>>"+Thread.currentThread().getId());System.out.println("handlerMeaage");}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。