Android注销方法和明确的共享首选项无效

时间:2017-10-11 01:59:38

标签: android android-fragments android-activity sharedpreferences logout

我有一个主要活动,第一次启动LoginActivity。每个人都可以。当用户登录时,用户的信息保存在共享偏好中(以向ApiRest发出请求),因此这个仅在第一次启动登录的功能正常工作,因为下次启动应用程序时我会留在mainActivity中。这个主要活动有3个片段(在viewpager中)3个片段在创建时请求自动从api获取信息。我的问题是在mainActivity的appbar中我有一个注销用户的菜单项。我的目的是将应用程序重定向到loginActivity并清除活动堆栈并清除共享偏好。但我的结果是。 1.我被重定向到登录活动,但当我关闭应用程序并再次打开它时,它不尊重我在主活动中的方法(如果它是第一次必须重定向到LoginActivity)并创建3个片段,立即启动发出请求,但他们没有参数(因为我清除共享的首选项,它们为null或0)所以应用程序崩溃。为什么我的方法首次打开LoginActivity被省略?谢谢先进

这是我的MainActivity,其方法是在注销后失败或省略

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Variables variableGlobal = (Variables)getApplicationContext();
    SharedPreferences sharedPreferences= getSharedPreferences("firstTime",this.MODE_PRIVATE);
    boolean firstTime = sharedPreferences.getBoolean("firstTime",true);
    if(firstTime){
        SharedPreferences.Editor edit = sharedPreferences.edit();
        edit.putBoolean("firstTime", false);
        edit.commit();
        startActivity(new Intent(MainActivity.this, LoginActivity.class));
        finish();

    }....

这是我的退出代码:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.logoutmain) {
//Here i clear the sharedpref datos wich contains the user information
        SharedPreferences pref = getSharedPreferences("datos",MODE_PRIVATE);
        SharedPreferences.Editor editorpref = pref.edit();
        editorpref.clear();
        editorpref.commit();

//Here i clear the sharedPref that contains the value (boolean) to say the app if it is the first time or not
        SharedPreferences pref2 = getSharedPreferences("firstTime",this.MODE_PRIVATE);
        SharedPreferences.Editor editorpref2 = pref2.edit();
        editorpref2.putBoolean("firstTime",true);
        editorpref2.commit();
        System.out.println("shared pref cleared");
        Intent intent=new Intent(getApplicationContext(),MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
        return true;
    }...

这是我的loginActivity:

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    btnLogin= (Button)findViewById(R.id.btnLogin);

    api= ApiUtils.getAPIService();
    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            login();
        }
    });

}

请记住,当我运行我的应用程序时,检查它是否是第一个运行它的方法启动到LoginActivity工作正常,它只启动firsTime,下次我总是在主活动中打开,但是当我注销它重定向我登录并清除堆栈和sharedpref,但OMITT方法是第一次chek,并让我在MainActivity和应用程序崩溃。为什么??感谢adavanced

1 个答案:

答案 0 :(得分:0)

我发现您的逻辑存在问题,quickFix将在您的MainActivity中使用以下代码:

var firebaseList = loggedInUserId.flatMap((userId) => 
this.db.list(this.firebaseRoot.child(userId)))  as FirebaseListObservable<any>
firebaseList.flatMap(items=>ob.push({foo:'bar'})).subscribe()