如果平时下载一个文件需要耗费比较长的时间的话,那么下载过程中,如果把功能直接写在Activity中,作为Activity的一部分的话,那么可能导致在下载的过程中,整个Activity是没有响应的,造成用户不友好体验,过长时间,Activity还可能报错。
那么这里的解决办法是:下载放在一个的单独线程,Activity是一个另一个线程,这样用户体验更好。
Handler就是为了实现这样的功能的。
例子
首先我们在xml布局文件中加上两个按钮。
再在HandlerActivity.java中根据控件ID得到控件对象,并给这两个按钮设置相应的监听器。
代买如下:
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HandlerActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
Button start = (Button)this.findViewById(R.id.start);
start.setOnClickListener(new startButtonListener());
Button stop = (Button)this.findViewById(R.id.stop);
stop.setOnClickListener(new stopButtonlistener());
}
//Android操作系统所提供的Handler类
Handler handler = new Handler();
//线程类,采用匿名内部类实现runnable接口
Runnable updateThread = new Runnable(){
//线程运行状态:就绪,运行(run中代码),阻塞,死亡(run代码运行完)
@Override
public void run() {
//handler.postDelayed(Runnable r, delayMillis);
//postDelayed方法
//1.消息队列,先进先出,消息加入队列,再从队列中一个一个的取出消息内容
//2.post就是将updateThread线程加入Delayed消息队列中去,
//当从消息队列中取出该线程时就会启动线程的运行,3000ms后,再把updateThread对象加入到消息队列中去,隔3s加进去一次
//加进去的线程不一定能马上执行,每一个handler都有一个与之相关联的消息队列
handler.postDelayed(updateThread, 3000);
}
};
class startButtonListener implements OnClickListener{
@Override
public void onClick(View arg0) {
//handler.post(Runnable r));
//post方法将updateThread线程加入到消息队列中去,这里没有延时
//第一次加入,消息队列中只有它,所以它一旦被加进去就会马上被执行handler.postDelayed(updateThread, 3000);
handler.post(updateThread);
}
}
class stopButtonlistener implements OnClickListener{
@Override
public void onClick(View arg0) {
//handler.removeCallbacks(Runnable r);
//removeCallbacks方法,将线程不再执行
handler.removeCallbacks(updateThread);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.handler, menu);
return true;
}
}
总结
- 首先创建一个Handler对象
- 运用内部类方法生成一个线程对象
- 调用Handler的post方法将所要执行的线程对象添加到队列中去
- 将要执行的操作(下载大文件等)写在线程对象的run方法中 –>异步消息处理