2016-03-31 7 views
0

Das ist mein AsyncTaskAsyncTask Fehler onPostExexcute wird nie

private class RetrieveFeedTask extends AsyncTask<Void, Void, String> { 

    private Exception exception; 

    protected void onPreExecute() { 
     progressBar.setVisibility(View.VISIBLE); 
     sqNameTV.setText(""); 
     sqdescriptionTV.setText(""); 
     sqdetailedDescriptionTV.setText(""); 
    } 

    protected String doInBackground(Void... urls) { 





     try { 
      URL url = new URL(URLi); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        stringBuilder.append(line).append(" "); 
       } 
       bufferedReader.close(); 
       String ress = stringBuilder.toString(); 
       JSONObject object = new JSONObject(ress); 
       JSONArray itemListElement = object.getJSONArray("itemListElement"); 
       InputStream is; 
       for (int i = 0; i < itemListElement.length(); i++) { 
        JSONObject c = itemListElement.getJSONObject(i); 
        JSONObject results = c.getJSONObject("result"); 
        JSONObject image = results.getJSONObject("image"); 
        String contentUrl = image.getString("contentUrl"); 
        is = (InputStream) new URL(contentUrl).getContent(); 
        d = Drawable.createFromStream(is, "src name"); 
       } 
       return stringBuilder.toString(); 
      } finally { 
       urlConnection.disconnect(); 
      } 
     } catch (Exception e) { 
      Log.e("ERROR", e.getMessage(), e); 
      return null; 
     } 
    } 

    protected void onPostExecute(String response, Drawable dd) { 
     if (response == null) { 
      response = "THERE WAS AN ERROR"; 
      Toast.makeText(MainActivity.this, "post execute", Toast.LENGTH_LONG).show(); 
     } 
     progressBar.setVisibility(View.GONE); 
     Log.i("INFO", response); 

     // Appropriate error handling code 
     try { 
      JSONObject object = new JSONObject(response); 
      JSONArray itemListElement = object.getJSONArray("itemListElement"); 
      for (int i = 0; i < itemListElement.length(); i++) { 
       JSONObject c = itemListElement.getJSONObject(i); 
       JSONObject results = c.getJSONObject("result"); 
       String name = results.getString("name").toString(); 
       String description = results.getString("description").toString(); 
       JSONObject image = results.getJSONObject("image"); 
       String contentUrl = image.getString("contentUrl"); 
       JSONObject detailedDescription = results.getJSONObject("detailedDescription"); 
       String articleBody = detailedDescription.getString("articleBody"); 
       sqNameTV.setText(name); 
       sqdescriptionTV.setText(description); 
       Drawable imageQ = LoadImageFromWebOperations(contentUrl); 
       Log.e("TAG",contentUrl); 
       sIV.setImageDrawable(d); 
       sqdetailedDescriptionTV.setText(articleBody); 
      } 
     } catch (JSONException e) { 
      sqNameTV.setText("Empty"); 
      sqdescriptionTV.setText("No Data Found"); 
      sqdetailedDescriptionTV.setText("Could not find any data on " + queryyy); 
     } 
    } 
} 
private Drawable LoadImageFromWebOperations(String strPhotoUrl) { 
    try { 
     InputStream is = (InputStream) new URL(strPhotoUrl).getContent(); 
     Drawable d = Drawable.createFromStream(is, "src name"); 
     Log.e("TAGG", strPhotoUrl); 
     return d; 
    } catch (Exception e) { 
     Log.e("TAGG", e.toString()); 
     return null; 
    } 

und es war richtig funktionieren genannt. Später, da ich auch ein Bild bekommen musste, habe ich ein paar JSON-Parsing in doInBackground() eingefügt. Dann wird onPostExecute aus irgendeinem Grund nie aufgerufen. Irgendeine Idee warum? Danke

+0

haben Sie Test ist, dass Sie ein Timeout oder haben Ausnahme? – ARP

+0

Nein. Mein Fortschrittsbalken dreht sich gerade weiter. Kein Protokoll, dass onPostExecute gestartet –

Antwort

2

Der dritte Parameter in der AsyncTask-Deklaration definiert den Rückgabetyp der AsyncTask.

private class RetrieveFeedTask extends AsyncTask<Void, Void, String> 

also nach Ihrer Definition, die onPostExecute() Methode sollte nur ein String als Parameter erwartet, weil Sie nur einen String aus dem Hintergrund-Thread zurück. Ihre Definition von onPostExecute() hat zwei Parameter. Sollte nur einer sein, der als Rückgabetyp der AsyncTask definiert ist.

+0

Hallo wieder Swayam! Aber ich gebe nicht nur 'return stringBuilder.toString();'? –

+0

Hallo, schon wieder! Ja, Return Statement ist in Ordnung. Das Problem liegt bei 'protected void onPostExecute (String response, Drawable dd)'. – Swayam

+0

Danke. Ich bin so groß ..... Ich kann nicht glauben, dass ich so einen dummen Fehler gemacht habe. Nochmals vielen Dank! –

1

Ihre onPostExecute() verhält sich als unabhängige Methode -

protected void onPostExecute(String response, Drawable dd) 

Nach dem Entwurf des AysncTask, wenn Sie das Android-System wollen onPostExecute() aufzurufen, sollte es dann so gestaltet sein -

protected void onPostExecute(String response) 

Für

AsyncTask<Void, Void, String>, 
1st Void - Paramater type in doInBackground() 
2nd Void - Paramater type in onProgressUpdate() 
3rd String - Return type of doInBackground() and Paramater type in onPostExecute() 
+0

Danke für die Antwort. Ich musste es jedoch der ersten Antwort geben. Es tut uns leid. +1 –