如何在SharedPreferences自定的类里面,做截住去访问服务器的动作?

我现在要做一个让项目里面的类,统一访问一个SharedPreferences里面的用户ID,那么,我写一个类,用来只作userId的访问,在里面,如果userId为空的话, 也就是没有登录过,那么,让用户去登录或者弹出Toast,但是,我写的一个方法是

public String getUserId() {
        if (userId!=null || !"".equals(userId)){
            return userId;
        }else
        return "请登录";
    }

显然不对,它怎么样,都会给调用的类,返回信息,且,其它类,调用时,就在OkHttp的网络线程上调用的,是不能Toast的,

img


如果想要在一个访问服务器的Manager类中设置如果userId为空的话,就显示一个请登录或Toast一个信息。那么,如果这个类没有extends AppcompatActivity的话,怎样让,在不访问服务端之前,就让其截住要访问的这个动作呢。。
不能每次都让它访问了,再从后端 返回 一个信息,什么 用户ID不能为呀,这些的信息,也不合适哈。减少服务端的压力嘛。。
在SharedPrConst类里面判断,userId为空的话,就跳转到登录界面或Toast?。。该怎么做呢?
下面是自定的 SharedPrConst 做userId查询的

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()函数之间