一、提要
【移动开发|Android入门(5)最简单的Handler例子】 昨天和今天都在看这个东西,关键是我Java的水平也就是Just soso,当时上课的时候线程和进程这方面并没有深入去学习,结果现在就悲剧了...
但经过将近两天的学习,还算有点起色。
下面是最简单的一个Handler实现,效果是点击startButton之后,不断更新进度条,满了 之后给出提示。
二、Handler简介
什么是Handler
handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过 handler.sendMessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时候可以新建一个thread,这 个thread拥有UI线程中的一个handler。当thread处理完一些耗时的操作后通过传递过来的handler像ui线程发送数据,由UI线程 去更新界面。
Handler类的常用方法
方法签名 |
描述 |
public void handleMessage (Messagemsg) |
子类对象通过该方法接收信息 |
public final boolean sendEmptyMessage (int what) |
发送一个只含有what值的消息 |
public final boolean sendMessage (Messagemsg) |
发送消息到Handler, 通过handleMessage方法接收 |
public final boolean hasMessages (int what) |
监测消息队列中是否还 有what值的消息 |
public final boolean post (Runnabler) |
将一个线程添加到消息队列 |
开发带有Handler类的程序步骤
在Activity或Activity的Widget中开发Handler类的对象,并重写handleMessage方法。
在新启动的线程中调用sendEmptyMessage或者sendMessage方法向Handler发送消息。
Handler类的对象用handleMessage方法接收消息,然后根据消息的不同执行不同的操作。
三、代码清单
package com.example.progressbar;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.view.View.OnClickListener;
public class ProgressBarHandle extends Activity {
ProgressBar bar=null;
Button startButton=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar_handle);
bar=(ProgressBar)findViewById(R.id.myProgressBar1);
startButton=(Button)findViewById(R.id.myButton);
startButton.setOnClickListener(new ButtonListener());
}@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_progress_bar_handle, menu);
return true;
}
class ButtonListener implements OnClickListener
{@Override
public void onClick(View v) {
// TODO Auto-generated method stub
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}}
Handler updateBarHandler=new Handler(){
@Override
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}};
Runnable updateThread=new Runnable()
{
int i=0;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Begin Thread");
i+=10;
Message msg=updateBarHandler.obtainMessage();
msg.arg1=i;
try{
Thread.sleep(1000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
updateBarHandler.sendMessage(msg);
if(i==100)
{
updateBarHandler.removeCallbacks(updateThread);
Toast.makeText(getApplicationContext(),
"Done!",
Toast.LENGTH_SHORT).show();
}
}};
}
一句话总结:handler对线程的处理并没有启动一个新的线程 ,而是直接在原有的线程上调用run函数.和new Thread(),然后start()概念完全不一样!
四、参考资料
Android developers:http://developer.android.com/training/basics/firstapp/running-app.html google的官方教程,非常推荐。
雷一的博客:http://www.cnblogs.com/rayee/tag/Android/ 素然只有四篇,但作为入门教程还是很不错的。
Android 开发教程:网上流传的教程,缺点是有点老。
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])