1

I am having problem getting the value of the ArrayList. When I debug the array list has a value but when it get out of the loop the ArrayList value is null. Please help me fix this issue. Async task might be the issue.

private List testDownloadSpeed(DownloadTestInformation download) throws IOException {

    List<DownloadTestResult> results = new ArrayList<>();

    if (download.downloadUrls != null && download.downloadUrls.size() > 0) {
        for (String urlString : download.downloadUrls) {

            Double throughput = null;

                downloadSpeedTestTask  = new DownloadSpeedTestTask();
                String[] params = new String[2];
                params[0] = urlString;
                params[1] = download.timeboxInSeconds;
                try {
                    throughput = downloadTestTask.execute(params).get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }

            results.add(new DownloadTestResult(urlString, throughput));
        }
    }

    if (!results.isEmpty()) {
        return results;
    } else {
        return null;
    }
}

The AsyncTask class:

protected class DownloadTestTask extends AsyncTask<String, Void, Double> {

    @Override
    protected Double doInBackground(String... URLSting) {

        try {
            URL url = new URL(URLSting[0]);
            Long timeout = Long.valueOf(URLSting[1]);

            if (url != null) {
                int totalSize = 0;
                HttpURLConnection connection = null;
                try {
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout((int) (timeout * 1000));
                    connection.connect();

                    int status = connection.getResponseCode();
                    if (status >= 400) {
                        throw new RuntimeException("Invalid status from server: " + status);
                    }
                    totalSize = connection.getContentLength();

                } catch (ProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (connection != null) {
                        try {
                            connection.disconnect();

                            return Double.valueOf(totalSize);
                        } catch (Exception ex) {
                            logger.log(Level.WARNING, "Unable to close connection", ex);
                        }
                    }
                }

            } else {
                logger.log(Level.WARNING, "Unable to parseURL:", URLSting);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return null;
    }

}
1

1 Answer 1

2

The execute method must not be used expecting a result value, as you are using it. You should put all of your code that must be executed after the AsyncTask in an overridden method onPostExecute.

The doInBackground returns the value and calls the onPostExecute callback.

But in your case, you can do everything in the doInBackground:

protected class DownloadTestTask extends AsyncTask<DownloadTestInformation, Void, List<DownloadTestResult>> {

    @Override
    protected Double doInBackground(String... params) {

        List<DownloadTestResult> results = new ArrayList<>();
        DownloadTestInformation download = params[0];

        if (download.downloadUrls != null && download.downloadUrls.size() > 0) {
            for (String urlString : download.downloadUrls) {

                Double throughput = null;

                downloadSpeedTestTask  = new DownloadSpeedTestTask();

                URL url = new URL(urlString);
                Long timeout = Long.valueOf(download.timeboxInSeconds);

                if (url != null) {
                    int totalSize = 0;
                    HttpURLConnection connection = null;
                    try {
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("GET");
                        connection.setConnectTimeout((int) (timeout * 1000));
                        connection.connect();

                        int status = connection.getResponseCode();
                        if (status >= 400) {
                            throw new RuntimeException("Invalid status from server: " + status);
                        }
                        totalSize = connection.getContentLength();

                    } catch (ProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (connection != null) {
                            try {
                                connection.disconnect();

                                return Double.valueOf(totalSize);
                            } catch (Exception ex) {
                                logger.log(Level.WARNING, "Unable to close connection", ex);
                            }
                        }
                    }

                } else {
                    logger.log(Level.WARNING, "Unable to parseURL:", URLSting);
                }

                results.add(new DownloadTestResult(urlString, throughput));
            }
        }

        if (!results.isEmpty()) {
            return results;
        } else {
            return null;
        }
    }

    @Override
    protected void onPostExecute(List<DownloadTestResult> result) {
        //Whatever you need to do afterwards
    }

}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.