我现在要做一个让项目里面的类,统一访问一个SharedPreferences里面的用户ID,那么,我写一个类,用来只作userId的访问,在里面,如果userId为空的话, 也就是没有登录过,那么,让用户去登录或者弹出Toast,但是,我写的一个方法是
public String getUserId() {
if (userId!=null || !"".equals(userId)){
return userId;
}else
return "请登录";
}
显然不对,它怎么样,都会给调用的类,返回信息,且,其它类,调用时,就在OkHttp的网络线程上调用的,是不能Toast的,
public class SharedPrConst extends AppCompatActivity {
private static SharedPrConst mInstance = null;
public static SharedPrConst getInstant() {
if (mInstance == null) {
//加线程通路锁
synchronized (SharedPrConst.class) {
if (mInstance == null) {
mInstance = new SharedPrConst();
}
}
}
//返回唯一对象
return mInstance;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private SharedPreferences sp = ActivityUtils.getTopActivity().getSharedPreferences("userInformation", Context.MODE_PRIVATE);
public String userId = sp.getString("userId", "");
public String getUserId() {
if (userId!=null || !"".equals(userId)){
return userId;
}else
return "请登录";
}
把SharedPreference写成公共类,然后在 Application下面挂载,全局可用;
还可以用静态方法的形式来 处理;
注意,楼上 说的在okhttp的拦截器中处理,需要考虑多线程 的问题;
因为SharedPreference不是线程安全。
// 判断得到值为null则为没有登录
public String getUserId(Context context) {
if (TextUtils.isEmpty(userId)){
Toast.makeText(context,"请登录",Toast.LENGTH_SHORT).show();
// 自己跳转登录界面
context.startActivity(......);
return null;
}else{
return userId;
}
}
你直接在OkHttp的拦截器(会在网络请求触发之前)里面判断userId是不是空或者“”,从而判断用户是不是登录了,不是的话跳登录界面或弹toast,子线程弹toast,你可以把toast放在Loop.prepared()和Loop.loop()函数之间