从Asynctask返回值

时间:2011-03-20 19:08:28

标签: java android

好的,我一直试图让它工作一段时间。我希望能够让我的用户登录而不会让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);
        }
    }

}

2 个答案:

答案 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应该负责转换。