Java AsyncTask,根据存储在共享首选项中的时间检查当前会话
我是android新手,但出于练习和学习的兴趣,我想尝试制作一个实践应用程序,基本上只允许用户在第一次登录的那一分钟内登录。因此,换句话说,如果您在10:23登录,当时钟敲响10:24时,用户将立即注销。为此,我通过我的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
LoginActivity
登录,在SharedReferences
对象中共享当前分钟。为了使用myAppActivity
中的onResume()
方法,我的应用程序首先打开主活动AppActivity
,然后在myAppActivity
类的onCreate()
方法中打开myLoginActivity
。希望在我的解释中不会有太多冗余,我们的目标是在我的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);
Toast.makeText(context, "Activity session has expired", Toast.LENGTH_SHORT).show();
startActivity(new Intent(context, LoginActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
do {
if (getTime >= pref.getInt (SESSION, result)) break;
try{
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (true);
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()方法。就可以了!感谢您在处理意图方面提供的额外帮助,我以前不知道意图标志的使用