[英]Using AsyncTask to login user
我需要获取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>
有人可以给我建议如何更改代码吗?
您的异步任务已声明:
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
完成后再使用该对象。
将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;
}
}
}
调用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()
}
}
}
您也可以遇到失败:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.