Android学习之异步任务Handler

本文详细介绍了Android中Handler机制的应用,重点讲解了如何通过Handler解决线程安全问题及UI更新管理,并提供了一个具体的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来讲下Handler,为什么要使用Handler呢?主要有两个原因:

一是线程安全问题,假如同时有两个线程对一个UI控件进行调整,那么控件自然就没法正常的工作。而Handler永远都是在UI主线程,这就意味着对一个控件的修改永远只会有一个线程,不会存在多个线程同时修改一个控件。二是方便统一管理,通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。就是另一个线程发送一个编号给消息所在的线程,那么该线程的消息处理程序就会收到该消息并进行处理,而消息采用int类型,所以int能够表示多少种数字就以为着有多少消息可以给你使用。

下面使用一个发送不同的消息来进入不同的Activity的Demo来看看Handler的使用,如下:

常量类,个人习惯

/**
 * 常量
 *
 * @author yuzhentao
 */
public class Constants {

    public static final String SP_NAME = "sp_name";
    public static final String SP_STATE = "sp_state";
    public static final int STATE_FIRST = 1001;
    public static final int STATE_SIGN_IN = 1002;
    public static final int STATE_NOT_SIGN_IN = 1003;

}
SP工具,这样方便使用

/**
 * SharedPreferences工具
 *
 * @author yuzhentao
 */
public class SharedPreferencesUtil {

    /**
     * 设置SharedPreferences
     *
     * @param context:Context
     * @param key:键
     * @param value:值
     */
    public static void setSP(Context context, String key, int value) {
        Editor et = context.getSharedPreferences(Constants.SP_NAME, Context.MODE_PRIVATE).edit();
        et.putInt(key, value);
        et.apply();
    }

    /**
     * 获取SharedPreferences
     *
     * @param context:Context
     * @param key:键
     * @param defaultValue:值
     * @return      */
    public static int getSP(Context context, String key, int defaultValue) {
        SharedPreferences sp = context.getSharedPreferences(Constants.SP_NAME, Context.MODE_PRIVATE);
        return sp.getInt(key, defaultValue);
    }

}
接下来是几个Activity

/**
 * 引导界面
 *
 * @author yuzhentao
 */
public class LogoActivity extends Activity {

    private static final int GO_GUIDE = 1;
    private static final int GO_SIGN_IN = 2;
    private static final int GO_MAIN = 3;

    private static final int DELAY_TIME = 1000;

    private Context context;

    private LogoHandler logoHandler = new LogoHandler(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logo);
        context = this;
        initView();
    }

    private void initView() {
        int state = SharedPreferencesUtil.getSP(context, Constants.SP_STATE, Constants.STATE_FIRST);
        if (state == Constants.STATE_FIRST) {
            logoHandler.sendEmptyMessageDelayed(GO_GUIDE, DELAY_TIME);
        } else {
            if (state == Constants.STATE_NOT_SIGN_IN) {
                logoHandler.sendEmptyMessageDelayed(GO_SIGN_IN, DELAY_TIME);
            } else if (state == Constants.STATE_SIGN_IN){
                logoHandler.sendEmptyMessageDelayed(GO_MAIN, DELAY_TIME);
            }
        }
    }

    /**
     * 开启Activity
     *
     * @param activity:Activity
     * @param cls:Class<?>
     */
    private static void startActivity(Activity activity, Class<?> cls) {
        activity.startActivity(new Intent(activity, cls));
        activity.finish();
    }

    /**
     * LogoHandler
     */
    private static class LogoHandler extends Handler {

        private final WeakReference<LogoActivity> logoActivityWeakReference;

        LogoHandler(LogoActivity activity) {
            logoActivityWeakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            LogoActivity activity = logoActivityWeakReference.get();
            switch (msg.what) {
                case GO_GUIDE:
                    startActivity(activity, GuideActivity.class);
                    break;
                case GO_SIGN_IN:
                    startActivity(activity, SignInActivity.class);
                    break;
                case GO_MAIN:
                    startActivity(activity, MainActivity.class);
                    break;
            }
        }

    }

}
/**
 * 引导界面
 *
 * @author yuzhentao
 */
public class GuideActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        findViewById(R.id.button_activity_guide).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(GuideActivity.this, SignInActivity.class));
            }
        });
    }

}
/**
 * 登录界面
 *
 * @author yuzhentao
 */
public class SignInActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);
        SharedPreferencesUtil.setSP(this, Constants.SP_STATE, Constants.STATE_NOT_SIGN_IN);
        findViewById(R.id.button_activity_sign_in).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferencesUtil.setSP(SignInActivity.this, Constants.SP_STATE, Constants.STATE_SIGN_IN);
                startActivity(new Intent(SignInActivity.this, MainActivity.class));
            }
        });
    }

}
/**
 * 主界面
 *
 * @author yuzhentao
 */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SharedPreferencesUtil.setSP(this, Constants.SP_STATE, Constants.STATE_NOT_SIGN_IN);
    }

}
每个Activity中通过使用SharedPreferences来给每个Activity设置不同的标记,然后第一个Activity即LogoActivity来获取SP的值来选择发送不同的消息到LogoHandler的handleMessage()中进行处理,handleMessage()顾名思义是用来处理消息的,根据不同的message来启动不同的Activity。

这里注意Handler必须为static的,然后使用弱引用的方式来传递Activity,不然肯定会报@SuppressLint("HandlerLeak")警告,解决方式就是采用这种写法。

最后是效果图:


Demo地址:http://download.youkuaiyun.com/detail/qq_23940659/9467052

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值