Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning an array[] from AsyncTask back to Main Activity

I am trying to return an array from my AsyncTask back to my Activity as I am trying to create a ListView from that array. Unfortunately, the program bounds error because it wouldn't let me return an array. My codes are as below:

MainMenu Class:

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();
            }
        }
    }
}

My question is how I am supposed to modify so that I am able to read my Array back on my activity with my connections remains intact.

like image 959
Vincey Avatar asked Feb 03 '13 08:02

Vincey


1 Answers

I would recommend that you declare your MainAsyncTask like this:

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

Then modify doInBackground to do all the processing that you are now doing in onPostExecute (except for the Toast part) and have it return the String[] (or null if there's an error). You can store the result code in an instance variable of MainAsyncTask and return null on error. Then onPostExecute has access to the same info that it does with your current code. Finally, if there is no error, just call a method in your main activity from onPostExecute to do the UI updates, passing it the String[] result.

like image 111
Ted Hopp Avatar answered Oct 08 '22 20:10

Ted Hopp