Android学习->Handler的使用(一)

如果平时下载一个文件需要耗费比较长的时间的话,那么下载过程中,如果把功能直接写在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方法中 –>异步消息处理

猜你喜欢

转载自blog.csdn.net/weixin_42882887/article/details/81667142