Amir Ismail
Amir Ismail

Reputation: 115

Android application force Close on lowsy Internet connection

I have the following code for to perform xml download via asynctask for android application targeting for android version>3. The code work pretty good if the network/internet connection is good. However, if internet connection is not good, the application will force close. I have tried throw in different kind of error catching but still unable to solve the force close on lowsy internet connection.

Anyone has any suggestion that I can try

private class DownloadWebPageXML extends AsyncTask<String, Void, InputStream> {
    @Override
    protected InputStream doInBackground(String... urls) {
        Log.d("mylogitem", "AsyncTask started!");
        InputStream content = null;
        String myurl = urls[0];

        AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
        HttpGet httpGet = new HttpGet(myurl);
        try {
             HttpResponse execute = client.execute(httpGet);
             content = execute.getEntity().getContent();
        } catch (Exception e) {
            xmldownloaderror = e.getMessage();
            Log.d("mylogitem", e.getMessage());
        } finally {
            Log.d("mylogitem", "Closing AndroidHttpClient");
            client.close();
        }
        return content;
    }

    @Override
    protected void onPostExecute(InputStream result) {
        //do xml reader on inputstream
    }   
}

Upvotes: 0

Views: 300

Answers (3)

Amir Ismail
Amir Ismail

Reputation: 115

I have found the root cause. It is not in the dobackground. In my case, lousy connection will sometime return not xml data type but rather loading error, and this is passed as the inputstream to my xmlparser in postexecute.

I did not put in much error catcher in my xmlparser. xmlparser is expecting xml document but received non-xml content, thus throwing null in which i did not cover with error catcher.

Thank you for the suggestion. I have place it in my code as well.

Upvotes: 0

warrenTaehoon
warrenTaehoon

Reputation: 81

hmm... I recommend to set connection times.

HttpClient client = new DefaultHttpClient();

HttpResponse response; BufferedReader bufferedReader = null;

HttpParams params = client.getParams();

HttpConnectionParams.setConnectionTimeout(params, 20000);

HttpConnectionParams.setSoTimeout(params, 20000);

Upvotes: 1

AAnkit
AAnkit

Reputation: 27549

add a null check on variable execute, in between these two lines

 HttpResponse execute = client.execute(httpGet);
 if(execute == null){ return null;} // null check to see if execute is null
 content = execute.getEntity().getContent();

another thing in onPostExecute, first line should check if InputStream result is null!

@Override
    protected void onPostExecute(InputStream result) {
        if(result == null){
         Log.d("TEMP_LOG",Content is null);
         return;
        }
        //do xml reader on inputstream
    }  

check and post your findings

Upvotes: 1

Related Questions