好的,我一直试图让它工作一段时间。我希望能够让我的用户登录而不会让UI挂起,直到服务器响应。当doinbackground完成后,我希望它将一个int值或一个布尔值传递给postexecute,然后我的其余代码将执行。出于某种原因,我在传递价值时遇到了问题。
有人能帮助我吗?
private class login extends AsyncTask<Integer, Void, Void>{
ProgressDialog dialog = ProgressDialog.show(MainActivity.this, "", "Loading, Please wait...", true);
String user = "";
@Override
protected int doInBackground(Integer... params) {
// TODO Auto-generated method stub
Log.i("thread", "Doing Something...");
int val = 0;
if(db.userLogin(userTxt.getText().toString(), passTxt.getText().toString(), getApplicationContext()) == "No User Found, please try again!"){
val = 0;
}
return val;
}
protected void onPreExecute(){
//dialog.dismiss();
Log.i("thread", "Started...");
dialog.show();
}
protected void onPostExecute(int result){
Log.i("thread", "Done...");
dialog.dismiss();
if(result == 0){
toast.setText("No User Found, please try again!");
toast.show();
}else{
Intent myIntent = new Intent(ctx, userInfo.class);
myIntent.putExtra("user", user);
startActivityForResult(myIntent, 0);
}
}
}
答案 0 :(得分:3)
使用AsyncTask
时,您提供3种类型。
第一个用于将参数传递给后台线程,
第二个用于在发布进度时传递信息,第三个用于将信息从后台线程返回到onPostExecute
。
您目前只使用第一种类型。
尝试:
private class login extends AsyncTask<Integer, Void, Integer>{
然后
protected void onPostExecute(Integer result){
有关详细信息,请参阅“{AsyncTask的泛型类型”部分中的here。
答案 1 :(得分:1)
如果希望登录类在postExecute(Result)方法中接受int或boolean,则必须在AsyncTask的泛型类型中指定要传入的值的类型。
因此,如果您希望传入一个int,则需要将类定义为:private class login extends AsyncTask<Integer, Void, Integer>
布尔值看起来像这样:private class login extends AsyncTask<Integer, Void, Boolean>
请注意,这些是Objects,Integer和Boolean,而不是primitives,int和boolean。你应该没有问题从doInBackground方法返回一个int或boolean(Integer ...),因为autoboxing应该负责转换。