【发布时间】:2015-01-12 23:24:38
【问题描述】:
1) 我已经在这里阅读了所有关于此的问题,所以请告诉我更多信息,而不仅仅是来自 SO...的 url...
2) 我只想从 asynctask 返回一个变量,但它可以是消息错误或用户详细信息。所以我决定返回索引为 0(错误消息)和 1(成功)的 ArrayList。
异步任务
public class LoginGet extends AsyncTask<String, ProgressBar, ArrayList<String>> {
...
public ArrayList<String> result = new ArrayList<String>();
public LoginGet(Context mContext, String loginText, String passwordText) {
//Get values form LoginActivity
}
protected void onPreExecute(){
super.onPreExecute();
// progressDialog
}
@Override
protected ArrayList doInBackground(String... arg0){
try {
// Making HTTP Request
try {
// Creating HTTP client
...
...
JSONObject jObject = new JSONObject(json);
success = jObject.getString("success");
result.add(0, "");
result.add(1, "");
if (success != null) {
if (success == "1") {
result.add(1, jObject.getString("hash"));
return result;
} else if (success == "0") {
result.add(0, jObject.getString("error"));
return result;
}
} else {
result.add(0, "Error while logging.");
return result;
}
// writing response to log
Log.d("Http Response:", response.toString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}catch (Exception e) {
}
return result;
}
@Override
protected void onPostExecute(ArrayList<String> result) {
((LoginActivity)context).getResult(result);
progressDialog.dismiss();
}
}
登录活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...
if (loginText.compareTo("") == 0 || passwordText.compareTo("") == 0) {
...
}else{
LoginGet loginPost = new LoginGet(LoginActivity.this,loginText,passwordText);
loginPost.execute();
}
}
});
}
// Get result from asynctask LoginGet
public void getResult(ArrayList<String> result){
if (result.get(0) != "") {
loginButton.setEnabled(true);
Toast.makeText(LoginActivity.this, result.get(0), Toast.LENGTH_SHORT).show();
} else if (result.get(1) != "") {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("Login", result.get(1));
editor.commit();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
}
错误:
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at cz.jacon.smsapp.LoginActivity.getResult(LoginActivity.java:57)
at cz.jacon.smsapp.background.LoginGet.onPostExecute(LoginGet.java:121)
at cz.jacon.smsapp.background.LoginGet.onPostExecute(LoginGet.java:30)
3) 在我的 AsyncTask 中,我有 result.add(0, ""); 和 result.add(1, "");,那么为什么 ArrayList 的大小为 0?
【问题讨论】:
-
首先java更正
result.get(0) != ""应该是!result.get(0).equals("") -
可能先读完这个(第 7 号第 5 号)javacoffeebreak.com/articles/toptenerrors.html
-
谢谢@Blundell :) 很高兴知道
标签: android arraylist android-asynctask return