【发布时间】:2019-01-24 14:23:18
【问题描述】:
有没有办法多次使用AsyncTask.execute()?
我正在使用AsyncTask 检查我的房间数据库中是否存在User。
我的 Login.class 看起来像这样:
public class Login extends AsyncTask<String, Boolean, Boolean> {
public Login(Context context, LoginListener listener){
db = ApplicationDatabase.getDatabase(context); //i get Room here
this.context = context; //context of app
this.listener = listener; //my interfece for observe Boolean, works ok
}
@Override
protected Boolean doInBackground(String... body){
try {
user = db.userDao().getUser(body[0], body[1]);
if (user != null)
return Boolean.TRUE; //we find user with credentials
else {
return Boolean.FALSE; //we not find user with that credentials (from body)
}
}
catch(Exception e){
return null;
}
}
protected void onPostExecute(Boolean result) {
listener.onLoginPerformed(result); //Boolen to activity
selfRestart(); //i want to restart task here
}
private void selfRestart(){
//maybe something to do here? its my own method
}
private ApplicationDatabase db;
private User user;
private LoginListener listener;
private Context context;
我这样调用Task(我的Activity.class):
login = new Login(getApplicationContext(), this);
//this is an interface that i implements in Activity definition
loginButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//execute() here, i cuted some not necesery code from here
try {
// im using get because i want to get valu from AsyncTask
login.execute(email, password).get();
}
catch(Exception e){ }
}
我读到,我们可以通过创建新的AsyncTask (Task = new Login()) StackOverflow Thread 来重置AsyncTask,但这对我不起作用。当我尝试在我的Login 课堂上做这样的事情时:
private void selfRestart(){
Login task = new Login(context, listener);
task.execute("");
//im calling it in onPostExecute()
}
我的安卓应用崩溃了。我的问题是,重置 AsyncTask 的最佳方法是在不同的文件中实现,然后是我的 Activity 类?或者也许有比在AsyncTask 中实现整个登录逻辑更好的方法来制作Login 活动?
编辑:
Logcat:
2019-01-24 15:45:31.407 1048-1048/com.example.admin.keystroke_dynamics E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.keystroke_dynamics, PID: 1048
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
at com.example.admin.keystroke_dynamics.Activities.LoginActivity.onLoginPerformed(LoginActivity.java:62)
at com.example.admin.keystroke_dynamics.Login.onPostExecute(Login.java:38)
at com.example.admin.keystroke_dynamics.Login.onPostExecute(Login.java:14)
at android.os.AsyncTask.finish(AsyncTask.java:692)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:709)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
【问题讨论】:
-
"我的 android 应用程序崩溃" -- 使用 Logcat 检查与您的崩溃相关的堆栈跟踪。 “或者也许有比在 AsyncTask 中实现整个登录逻辑更好的方法来进行登录活动?” -- 让 Room 返回您的活动观察到的
LiveData,您应该不再需要AsyncTask。 -
我更新了我的帖子,但我从
logcat获得了例外。我在 C# 堆栈中工作。当我制作我的房间数据库时,我基于谷歌的CodeLabs示例。我认为不需要LiveData来检查用户凭据。如果LiveData更好,你能举个例子吗?
标签: java android android-asynctask android-room