Libathos
Libathos

Reputation: 3362

Apparently missing an exception

in my android app I have an AsyncTask which downloads photos from my server. If I get an exception (mainly for connection time out) I show the user a message. My problem is that my code works MOST of the times, (meaning there are times when I interrupt the WiFi connection that I get an exception shown in my logcat but the message won't appear so I ended it up thinking that there might be an exception that I don't handle ) and I can't figure out the exact reason. I'll post the code run in my AsyncTask and the function that does the essential work. Hope you spot out something I'missing

        @Override
    protected String doInBackground(String... args) {               


    JSONParser jParser = new JSONParser();
    JSONObject jsonObj = jParser.getJSONFromUrl(url);
    Log.d("check1",url);
    try {

        list.addAll(processJsonData(jsonObj));

        } catch (JSONException e) {
            e.printStackTrace();
            onDownloadFailed(this);
            return "failed";
        } catch (SocketException e) {
            Log.e("Exception", e.getLocalizedMessage());
            onDownloadFailed(this);
            return "failed";
        } catch (IOException e) {
            Log.e("Exception", e.getLocalizedMessage());
            onDownloadFailed(this);
            return "failed";            
        }finally {
            jsonObj=null;
        }


        return "done"; 
    }

process JsonData is actually bigger that's the part for downloading the photos, the other part is about mapping string to an large Json File

  private ArrayList<Monument> processJsonData(JSONObject jsonObj) throws IOException, SocketException, JSONException{

            if(attachments!=null){
                int lengthSize;
                if(attachments.length()<3)
                    lengthSize=attachments.length();
                else
                    lengthSize=3;

                for(int j=0;j<lengthSize;++j){      

                            JSONObject atta = attachments.getJSONObject(j); 
                            JSONObject images = atta.optJSONObject(TAG_IMAGES); 
                            if(images!=null){
                                JSONObject medium = images.getJSONObject(TAG_MEDIUM);
                                String url_image = medium.getString(TAG_URL_IMAGE);                                 
                                String  id = atta.getString("id");

                                String filename =title.replace(" ","")+id+".nomedia";
                                File destination = new File(MyApplication.getPhotoStorage() ,filename);


                                    URL url = new URL (url_image);

                                    InputStream is = url.openStream();
                                    OutputStream os = new FileOutputStream(destination);


                                    byte[] b = new byte[2048];
                                    int length;

                                    while ((length = is.read(b)) != -1) {
                                        os.write(b, 0, length);
                                    }

                                    is.close();
                                    os.close();
                                    localPhotosUrl.add(destination.getAbsolutePath());

                            }

               }
        }

enter image description here

Upvotes: 0

Views: 83

Answers (2)

Rudi Kershaw
Rudi Kershaw

Reputation: 13012

The API for InteruptedException says the following;

Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. Occasionally a method may wish to test whether the current thread has been interrupted, and if so, to immediately throw this exception.

As described in the comments of the question, cancelling your AsyncTask only after checking that it has finished should prevent this issue.

Alternatively (but I would recommend against it), you could catch the InteruptedException in the method that cancels your AsyncTask to define your custom catch behavior there. Using catch to work around program logic flaws should only really be a last resort after reconsidering the logical flow of your code.

Upvotes: 0

ifloop
ifloop

Reputation: 8386

Maybe you could name the actual exception that is beeing thrown? It might be a RuntimeException and therefore unchecked.

For further information about checked/unchecked exceptions see: Oracle Docs - Exceptions

Upvotes: 1

Related Questions