我在这里写,因为这是我理解这种类型编程的最后一个解决方案。问题是我被困在用于处理与服务器的连接和登录的内容上。我应该使用异步任务,处理程序还是线程?我没有找到具体的答案说明使用哪一个,只发现异步任务用于下载图像或其他下载内容。
到目前为止,我已经使用线程连接到服务器。我遇到的问题是当我捕获异常(输入无效的用户名/密码)并尝试再次登录时。 (我需要“关闭”最后一个帖子并重新开始一个)
在此之后,我开始使用异步任务,但我真的不明白它应该如何工作,我被卡在无效的用户名/密码的祝酒词上。
private class connectStorage extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
api = DefaultClientFactory.create(host, getUser, getPassword);
if (api.getAuthToken().trim().length() > 3) {
//TO DO LAYOUT CHANGE;
}
} catch (StorageApiException e) {
e.printStackTrace();
Log.i("TEST", "" + e.getMessage());
}
return null;
}
另外,我100%确定在doInBackground
方法中调用inflate也行不通(我想改变活动)。
我按下按钮时启动异步任务。
答案 0 :(得分:1)
当你使用asynctask时 你有doInBackground和onPostExecute 所以基本上从doinbackground得到一个json或字符串或布尔值 并在onpostexecute中检查成功登录是否成功,如果成功保存服务器中的数据并开始转向另一个活动或向用户提供该用户登录详细信息错误并再试一次。
所以你的asynctask可以是你的活动类的内部类,它是登录和onClickSubmit按钮调用asynctask类,并在post执行时解析json并根据结果决定做什么
示例:
public class SignInAsycTask extends AsyncTask<RequestParams, Void, String> {
@Override
protected String doInBackground(RequestParams... params) {
return new HttpManager().sendUserData(params[0]);
}
@Override
protected void onPostExecute(String result) {
String[] details = parseJsonObject(result);
if (details != null) {
user.setUser_id(Integer.valueOf(details[0]));
user.setName(details[1]);
if (details.length > 2) {
user.setProfilePic(details[2]);
}
setSharedPreferences();
startActivity(new Intent(Signin.this, MainActivity.class));
finish();
} else {
Toast.makeText(Signin.this, "please try again",
Toast.LENGTH_LONG).show();
}
}
}
public String[] parseJsonObject(String result) {
JSONObject obj = null;
try {
obj = new JSONObject(result);
if (obj.has("success")) {
if (obj.getInt("success") == 1) {
if (obj.has("user_pic")) {
return new String[] {
String.valueOf(obj.getInt("user_id")),
obj.getString("user_name"),
obj.getString("user_pic") };
} else {
return new String[] {
String.valueOf(obj.getInt("user_id")),
obj.getString("user_name"), };
}
} else {
return null;
}
} else {
return null;
}
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
这里我的RequestParams只是一个对象,我存储了所有细节,如url参数发送等,doinbackground的输出是一个String,我在我的postexecute方法中解析它