Java AsyncTask,根据存储在共享首选项中的时间检查当前会话

Java AsyncTask,根据存储在共享首选项中的时间检查当前会话,java,android,android-asynctask,sharedpreferences,Java,Android,Android Asynctask,Sharedpreferences,我是android新手,但出于练习和学习的兴趣,我想尝试制作一个实践应用程序,基本上只允许用户在第一次登录的那一分钟内登录。因此,换句话说,如果您在10:23登录,当时钟敲响10:24时,用户将立即注销。为此,我通过我的LoginActivity登录,在SharedReferences对象中共享当前分钟。为了使用myAppActivity中的onResume()方法,我的应用程序首先打开主活动AppActivity,然后在myAppActivity类的onCreate()方法中打开myLogin

我是android新手,但出于练习和学习的兴趣,我想尝试制作一个实践应用程序,基本上只允许用户在第一次登录的那一分钟内登录。因此,换句话说,如果您在10:23登录,当时钟敲响10:24时,用户将立即注销。为此,我通过我的
LoginActivity
登录,在
SharedReferences
对象中共享当前分钟。为了使用my
AppActivity
中的
onResume()
方法,我的应用程序首先打开主活动
AppActivity
,然后在my
AppActivity
类的
onCreate()
方法中打开my
LoginActivity
。希望在我的解释中不会有太多冗余,我们的目标是在我的AppActivity的
onResume()
方法中调用
sessionChecker\u AsyncTask.execute()

这是我在
LoginActivity
中找到的登录按钮:

login_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int result = getTime();

            SharedPreferences pref = getSharedPreferences(PREF, MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            editor.putInt(SESSION, result);
            editor.commit();

            finish();
        }
    });
使用助手方法
getTime()
可以在这里看到:

private int getTime() {
        Calendar time = Calendar.getInstance();
        return time.get(Calendar.MINUTE);
    }
如您所见,我只是通过我的登录按钮将当前分钟存储在
SharedReferences
对象中。现在,我想在我的
AppActivity
类中创建一个
AsyncTask
,该类每隔500毫秒(.5秒)检查
AppActivity
中的当前分钟是否与存储在
SharedReferences
对象中的分钟相匹配,如果没有,我想将用户注销并将其发送回
LoginActivity

我的问题是,对于我的
doInBackground()
onPostExecute()
方法应该在
AsyncTask
中实现的类型,我有点困惑。我还需要
onCancelled()
方法,实现它可能对
AppActivity
中的配置更改有用吗?到目前为止,我想我应该这样设置:

private class SessionCheckerTask extends AsyncTask<Integer, Void, Boolean>
    {
        @Override
        protected Boolean doInBackground(Integer... minute_in_SharedPreferences) {
            //Create a thread that refreshes every 500ms that checks current time

            return false; //if the current time doesn't match the time in shared preferences
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);

            /*
                If false was returned create a toast that says "Activity session has expired"
                then open the login activity again
             */
        }
    }
私有类SessionCheckerTask扩展了异步任务
{
@凌驾
受保护的布尔doInBackground(整数…分钟\u in\u共享引用){
//创建一个每500毫秒刷新一次的线程来检查当前时间
返回false;//如果当前时间与共享首选项中的时间不匹配
}
@凌驾
受保护的void onPostExecute(布尔aBoolean){
super.onPostExecute(aBoolean);
/*
如果返回false,则创建一个表示“活动会话已过期”的toast
然后再次打开登录活动
*/
}
}
但是我也在想,
doInBackground()
根本不需要类型。相反,只有在
doInBackground()
中传递的分钟数与当前分钟数不匹配时,才应调用
onPostExecute()
,但我不确定如何以典型的
AsyncTask
格式实现这一点。

尝试以下方法:

  • 在你的背景中:

    do {
        if (getTime >= pref.getInt (SESSION, result)) break;
        try{
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (true);
    
  • 在onPostExecute中:

    Toast.makeText(context, "Activity session has expired", Toast.LENGTH_SHORT).show();
    startActivity(new Intent(context, LoginActivity.class)
                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
    
  • 注:我认为记住一分钟,然后将当前分钟与保存的分钟进行比较是错误的。例如,在21:59时,保存int“21”,但在下一秒它将是“22”。试着做同样的事情,但要用几秒钟。然后在doInBackground中使float a=pref.getInt(会话,结果),在do..中,在cycle make a+=0.5时,尝试以下操作:

  • 在你的背景中:

    do {
        if (getTime >= pref.getInt (SESSION, result)) break;
        try{
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (true);
    
  • 在onPostExecute中:

    Toast.makeText(context, "Activity session has expired", Toast.LENGTH_SHORT).show();
    startActivity(new Intent(context, LoginActivity.class)
                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
    

  • 注:我认为记住一分钟,然后将当前分钟与保存的分钟进行比较是错误的。例如,在21:59时,保存int“21”,但在下一秒它将是“22”。试着做同样的事情,但要用几秒钟。然后在doInBackground中使float a=pref.getInt(SESSION,result),在do..中循环使a+=0.5时,我还没有在家检查,但通过查看它,我非常确定这将非常有效。非常感谢!请在检查时说明它是否正常=),并检查活动是否仅存在于一个实例中(为此,我添加了Intent.FLAG\u activity\u NEW\u TASK)。因为如果用户将登录到许多活动中,这是不好的。如果它不起作用,您可以使用flag\u ACTIVITY\u SINGLE\u TOP发送意图,然后您要覆盖活动的onNewIntent()方法。就可以了!感谢您在处理意图方面提供的额外帮助,我之前不知道意图标志的使用,我现在还不在家检查,但是从查看它的情况来看,我非常确定这将非常有效。非常感谢!请在检查时说明它是否正常=),并检查活动是否仅存在于一个实例中(为此,我添加了Intent.FLAG\u activity\u NEW\u TASK)。因为如果用户将登录到许多活动中,这是不好的。如果它不起作用,您可以使用flag\u ACTIVITY\u SINGLE\u TOP发送意图,然后您要覆盖活动的onNewIntent()方法。就可以了!感谢您在处理意图方面提供的额外帮助,我以前不知道意图标志的使用