今天来讲下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