将一个数组[]从AsyncTask返回到Main Activity

时间:2013-02-03 08:33:21

标签: java android arrays android-listview android-asynctask

我正在尝试从我的AsyncTask返回一个数组回到我的Activity,因为我正在尝试从该数组创建一个ListView。 不幸的是,程序绑定错误,因为它不会让我返回一个数组。我的代码如下:

MainMenu课程:

public class MainMenu extends Activity {
String username;
public String[] returnValue;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);
    username ="user1";  

if (checkInternetConnection()) {

    try {
        MainAsyncTask mat = new MainAsyncTask(MainMenu.this);
        mat.execute(username);
    } catch (Exception e) {
        e.printStackTrace();
    }
} else {
    Toast.makeText(getApplicationContext(),"No internet connection. Please try again later",Toast.LENGTH_SHORT).show();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main_menu, menu);
    return true;
}

private boolean checkInternetConnection() {
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    if (conMgr.getActiveNetworkInfo() != null
            && conMgr.getActiveNetworkInfo().isAvailable()
            && conMgr.getActiveNetworkInfo().isConnected()) {
        return true;
    } else {
        return false;
    }
}}

MainAsyncTask:

public class MainAsyncTask extends AsyncTask<String, Void, Integer> {
    private MainMenu main;
    private String responseText, http;
    private Ipaddress ipaddr = new Ipaddress(http);
    private Context context;

    public MainAsyncTask(MainMenu main) {
        this.main = main;
    }

    protected Integer doInBackground(String... arg0) {
        int responseCode = 0;
        try {
            HttpClient client = new HttpClient(main.getApplicationContext());
            Log.e("SE3", ipaddr.getIpAddress());
            HttpPost httpPost = new HttpPost(ipaddr.getIpAddress()
                    + "/MainServlet");

            List<NameValuePair> nvp = new ArrayList<NameValuePair>();

            JSONObject json = new JSONObject();
            json.put("username", arg0[0]);

            Log.e("SE3", arg0[0]);

            nvp.add(new BasicNameValuePair("data", json.toString()));
            httpPost.setEntity(new UrlEncodedFormEntity(nvp));

            HttpResponse response = client.execute(httpPost);

            if (response != null) {
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    try {
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(response.getEntity()
                                        .getContent()));
                        StringBuilder sb = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        responseText = sb.toString();
                    } catch (IOException e) {
                        Log.e("SE3", "IO Exception in reading from stream.");
                        responseText = "Error";
                    }
                } else {
                    responseText = "Error";
                }
            } else {
                responseText = "Response is null";
            }
        } catch (Exception e) {
            responseCode = 408;
            responseText = "Response is null";
            e.printStackTrace();
        }
        return responseCode;
    }

    protected void onPostExecute(Integer result) {
        if (result == 408 || responseText.equals("Error")
                || responseText.equals("Response is null")) {
            Toast.makeText(main.getApplicationContext(),
                    "An error has occured, please try again later.",
                    Toast.LENGTH_SHORT).show();
        } else {
            JSONObject jObj;
            try {
                jObj = new JSONObject(responseText);
                String folderString = jObj.getString("folder");

                String [] folders = folderString.split(";");    
                //I need to return folders back to MainMenu Activity
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

我的问题是我应该如何修改以便能够在我的活动中读取我的数据,并且我的连接保持不变。

1 个答案:

答案 0 :(得分:4)

我建议你像这样宣布你的MainAsyncTask

public class MainAsyncTask extends AsyncTask<String, Void, String[]> {

然后修改doInBackground以执行您在onPostExecute中正在执行的所有处理(Toast部分除外)并让它返回String[](或{ {1}}如果有错误)。您可以将结果代码存储在null的实例变量中,并在出错时返回MainAsyncTask。然后null可以访问与当前代码相同的信息。最后,如果没有错误,只需从onPostExecute调用主活动中的方法来执行UI更新,并将onPostExecute结果传递给它。