【问题标题】:Return ArrayList from async task从异步任务返回 ArrayList
【发布时间】: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?

【问题讨论】:

标签: android arraylist android-asynctask return


【解决方案1】:

在我看来,result.add(0, ""); 甚至还没有到达,因为 try 块可能会失败。

可悲的是你有一个空的 catch 块,只是等待跳过它们错误:

catch (Exception e) {

}

您的解决方案是添加这些

result.add(0, "");
result.add(1, "");

doInBackground 的开头,甚至到构造函数,你应该没问题。

【讨论】:

  • 谢谢。显示错误消息,我想我现在可以理解了 :)
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 2013-04-16
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
相关资源
最近更新 更多