2011-03-20 122 views
1

好吧,我一直试图让这个工作一段时间。我希望能够让用户登录,而不必在服务器响应之前挂起UI。当doinbackground完成时,我希望它将一个int值或一个布尔值传递给postexecute,然后执行其余的代码。出于某种原因,我在传递值时遇到了问题。从Asynctask返回值

任何人都可以帮助我吗?

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

请解释你的“传递值的问题”是什么。 – CommonsWare 2011-03-20 19:10:56

回答

3

使用AsyncTask时,您提供3种类型。 第一个用于将参数传递给后台线程, 第二个用于在发布进度时传递信息,第三个用于将信息从后台线程返回到onPostExecute

您目前只使用第一种类型。

尝试:

private class login extends AsyncTask<Integer, Void, Integer>{ 

然后

protected void onPostExecute(Integer result){ 

欲了解更多信息,请参阅here在一节 “的AsyncTask的泛型类型”。

+0

谢谢你的快速回复。我很难理解这一点。 – 2011-03-20 19:57:23

1

如果你希望你的登录类接受的postExecute(结果)方法的int或布尔值,则必须在的AsyncTask的一般类型,以便指定哪些类型的值传递。

,如果你想一个int传递中,你需要定义你的类是这样的:private class login extends AsyncTask<Integer, Void, Integer> 和一个布尔值,应该是这样的:private class login extends AsyncTask<Integer, Void, Boolean>

请注意,这些都是对象,整数和布尔值,而不是基元,int和布尔值。你应该没有问题从你的doInBackground方法(Integer ...)返回int或boolean,因为自动装箱应该处理转换。