1

我需要获取user并将其保存到变量中。

public class MainActivity extends ActionBarActivity 
{
    User user = new LoginTask2().execute("");
}

class LoginTask2 extends AsyncTask<String, Void, User> {
    private Exception exception;
    public String hash = "";

    protected String doInBackground(String... t) {
        RestClient restClient = new HttpRestClient();
        restClient.setUserAgent("bot/1.0 by name");

        // Connect the user
        User user = new User(restClient, "User", "somepass");
        try {
            user.connect();
            //hash = user.getModhash();
            return user;
        } catch (Exception e) {
            e.printStackTrace();
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute(String string) {

    }
}

它看起来像它的工作,但我不知道如何获得user. 使用此代码,我得到错误:

Error:(49, 47) error: incompatible types
required: String
found:    AsyncTask<String,Void,String>

有人可以给我建议如何更改代码吗?

4

3 回答 3

2

您的异步任务已声明:

class LoginTask2 extends AsyncTask<String, Void, User> {
    protected String doInBackground(String... t) {

为了避免不兼容类型错误,您需要doInbackground返回一个User对象。

    protected User doInBackground(String... t) {

请参阅:http: //developer.android.com/reference/android/os/AsyncTask.html

你上面的代码:

User user = new LoginTask2().execute("");

也会失败,因为您必须执行异步任务,然后再使用返回值。User您可以通过将其设置为您的字段来访问返回的对象MainActivity,然后在完成后使用该对象AsyncTask

于 2015-06-10T18:22:33.593 回答
1

将您的 asyntask 定义为内部类并 onPostExecute 分配 mUser 类变量。

public class MainActivity extends ActionBarActivity 
    {
        User mUser;

        new LoginTask2().execute("");

    class LoginTask2 extends AsyncTask<String, Void, User> {
        private Exception exception;
        public String hash = "";

        protected User doInBackground(String... t) {
            RestClient restClient = new HttpRestClient();
            restClient.setUserAgent("bot/1.0 by name");

            // Connect the user
            User user = new User(restClient, "User", "somepass");
            try {
                user.connect();
                //hash = user.getModhash();
                return user;
            } catch (Exception e) {
                e.printStackTrace();
                this.exception = e;
                return null;
            }
        }

        protected void onPostExecute(User user) {
                mUser = user;
        }
    }
    }
于 2015-06-10T18:25:26.240 回答
1

调用 execute 方法时,AsyncTask 不会返回用户变量。所以下面的代码将不起作用。

User user = new LoginTask2().execute("");

让我们做一些改变。

private class LoginTask2 extends AsyncTask<String, Void, User> {
    private Exception exception;
    public String hash = "";

    @Override
    protected String doInBackground(String... t) {
        RestClient restClient = new HttpRestClient();
        restClient.setUserAgent("bot/1.0 by name");

        // Connect the user
        User user = new User(restClient, "User", "somepass");
        try {
            user.connect();
            //hash = user.getModhash();
            return user;
        } catch (Exception e) {
            e.printStackTrace();
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute(User user) {

    }
} 

由于您的 AsyncTask 仅属于您的此类,因此您应该将其设为私有。doInBackground 方法的返回值也是 onPostExecute 的参数。

为了保存用户数据,您可以采取以下几种方法:

可以使用 onPostExecute 方法来保存您的数据

protected void onPostExecute(User user) {
     //do save stuff
}

你也可以从你的类中调用一个方法,例如:

public class MainActivity extends ActionBarActivity {
    User user = new LoginTask2().execute("");

    private void success(User user){
       //do save stuff
    }

    private void failure(){

    } 

    private class LoginTask2 extends AsyncTask<String, Void, User> {
        private Exception exception;
        public String hash = "";

        @Override
        protected String doInBackground(String... t) {
            RestClient restClient = new HttpRestClient();
            restClient.setUserAgent("bot/1.0 by name");

            // Connect the user
            User user = new User(restClient, "User", "somepass");
            try {
                user.connect();
               //hash = user.getModhash();
               return user;
            } catch (Exception e) {
               e.printStackTrace();
               this.exception = e;
               return null;
           }
       }

       protected void onPostExecute(User user) {
             if(user != null)
                success(user)
             else
                failure()
       }
    } 
}

您还可以捕获失败:)

于 2015-06-10T18:50:00.760 回答