0

J'ai obtenu un List View dans mon application dans laquelle j'affiche les données par Base Adapter. Leur est deux problèmes que je suis confronté et référé quelques messages comme, mais tous ont suggéré la même procédure que j'ai suivie.Téléchargement d'image à partir de l'URL

Les problèmes sont

  1. Je suis en train de télécharger l'image de l'URL donnée de JSON. tout fonctionne bien mais l'image ne se règle jamais sur Image View.

  2. I lié à Text to Speech événement click bouton Base Adapter classe et Freed dans onDestroy de la classe java mais je reçois une erreur dans le journal pour l'énoncer this et les accidents application. Ici, dans la ligne log erroe n ° 55 est la première déclaration de onDestroy.

Voici mon code

Java Fichier

public class DisplayWeather extends Activity { 

    String city, date, maximumTemp, minimumTemp, description, weatherImageUrl; 
    ListView weatherList; 
    List <Bean> bean; 
    Bitmap myBitmap, newBitmap; 
    CustomBaseAdapter baseAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.display_weather); 

     bean = new ArrayList<Bean>(); 
     weatherList = (ListView) findViewById(R.id.lvWeather); 

     for(int i=0; i<WeatherHome.arrayList.size(); i++) 
     { 
      . 
        . 

     } 


     weatherList.setAdapter(new CustomBaseAdapter(this, bean)); 
    } 


    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     if (baseAdapter.tts != null) 
     { 
      baseAdapter.tts.stop(); 
      baseAdapter.tts.shutdown(); 
     } 
     super.onDestroy(); 
    } 

classe adaptateur de base

public class CustomBaseAdapter extends BaseAdapter implements OnInitListener { 
    Context context; 
    List<Bean> bean; 
    ImageView weatherImage; 
    TextView weatherDate, weatherCity, weatherMinimum, weatherMaximum, weatherDescription; 
    Button buttonSpeak; 
    String citySpeak, dateSpeak, descriptionSpeak, maximumSpeak, minimumSpeak, weatherURL; 
    TextToSpeech tts; 
    Bean userBean; 
    Bitmap myBitmap; 

    public CustomBaseAdapter(Context context, List<Bean> bean) { 
     // TODO Auto-generated constructor stub 
     this.context = context; 
     this.bean = bean; 
     tts = new TextToSpeech(context, null); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return bean.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return bean.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return bean.indexOf(getItem(position)); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

     if(convertView == null) 
     { 
      convertView = inflater.inflate(R.layout.custom_base_adapter, null); 
      weatherImage = (ImageView) convertView.findViewById(R.id.displayImage); 
convertView.findViewById(R.id.displayDate); 
      buttonSpeak = (Button) convertView.findViewById(R.id.Speak); 


     } 

     weatherURL = userBean.getImageUrl(); 

     new ImageDownload().execute(); 

     Log.i("Executing Rest Line>>>", "Skippedddddd"); 
     buttonSpeak.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
      String cityName = weatherCity.getText().toString(); 
      String dateValue = weatherDate.getText().toString(); 
      String maximumValue = weatherMaximum.getText().toString(); 
      String minimumValue = weatherMinimum.getText().toString(); 
      String descriptionValue = weatherDescription.getText().toString(); 

      citySpeak = "Temprature for city "+cityName+""; 
      dateSpeak = " on Date "+dateValue+""; 
      maximumSpeak = "will be Maximum upto "+maximumValue+" degree "; 
      minimumSpeak = " and Minimum upto"+minimumValue+" degree "; 
      descriptionSpeak = "and The atmosphere seems to be "+descriptionValue+""; 

      speakTempratureValues(); 
      } 
     }); 

     return convertView; 
    } 

    private class ImageDownload extends AsyncTask<String, Void, Bitmap>{ 

     protected Bitmap doInBackground(String... arg0){ 

      try{ 
       Log.e("src",weatherURL); 
       URL url = new URL(weatherURL); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoInput(true); 
       connection.connect(); 
       InputStream input = connection.getInputStream(); 
       myBitmap = BitmapFactory.decodeStream(input);  
       Log.e("Bitmap","returned"); 
       return myBitmap; 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
       return null; 
      } 

     } 

     protected void onPostExecute(Bitmap result){ 
      if(result!=null) 
      { 
       Log.i("OnPost>>>", ""+result); 
       weatherImage.setImageBitmap(result); 
      } 

     } 
    } 

    protected void speakTempratureValues() { 
     // TODO Auto-generated method stub 
     tts.setSpeechRate(-4); 
     tts.speak(citySpeak, TextToSpeech.QUEUE_FLUSH, null); 
     tts.speak(dateSpeak, TextToSpeech.QUEUE_ADD, null); 
     tts.speak(maximumSpeak, TextToSpeech.QUEUE_ADD, null); 
     tts.speak(minimumSpeak, TextToSpeech.QUEUE_ADD, null); 
     tts.speak(descriptionSpeak, TextToSpeech.QUEUE_ADD, null); 
     tts.speak("Thank You", TextToSpeech.QUEUE_ADD, null); 
    } 


    @Override 
    public void onInit(int status) { 
     // TODO Auto-generated method stub 
     if(status==TextToSpeech.SUCCESS){ 
      int result = tts.setLanguage(Locale.getDefault()); 

      if (result == TextToSpeech.LANG_MISSING_DATA 
        || result == TextToSpeech.LANG_NOT_SUPPORTED) { 
       Log.e("TTS", "This Language is not supported"); 
      } 
      else{ 

       speakTempratureValues(); 
      } 
     } 
     else{ 
      Log.e("TTS", "Initialization Failed"); 
     } 
    } 

} 
+0

Bienvenue dans StackOverflow. Vous devrez réduire votre code et vous concentrer sur le problème, avec autant de code qu'il est difficile de comprendre le vrai problème. – nKn

+0

Merci @nKn J'espère que c'est bien maintenant. – SDroid

+0

Essayant de définir le bitmap téléchargé dans la méthode getView (..) à la place. Comment: Initialiser une variable Bitmap et lui affecter le bitmap dans la méthode onPostExecute (..), puis définir l'image. – Aashir

Répondre

0

Ce que Louis a suggéré est le bon chemin. Je suis sûr que cela fonctionnera. La raison pour laquelle il ne fonctionne pas pour vous est pas sûr, mais essayez de cette façon:

Runnable runnable = new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        try{ 
         Log.e("src",weatherURL); 
         URL url = new URL(weatherURL); 
         HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
         connection.setDoInput(true); 
         connection.connect(); 
         InputStream input = connection.getInputStream(); 
         myBitmap = BitmapFactory.decodeStream(input);  
         Log.e("Bitmap","returned"+myBitmap); 

         if(myBitmap!=null) 
        { 
         Log.i("OnPost>>>", ""+myBitmap); 
         weatherImage.setImageBitmap(myBitmap); 
        } 
        } 
        catch(Exception e){ 
         e.printStackTrace(); 

        } 

       } 
      }; 

      Thread t = new Thread(runnable); 
      t.start(); 
      try { 
       t.join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

Probablement, la méthode de départ était absent pour vous et vous pourriez ne pas avoir appelé. J'espère que ce travail.

+0

@SDroid Je pensais que vous accepteriez Louis répondre :) – Saggy

+1

J'aurais accepté cela comme il m'a montré une autre façon de travailler mais je suppose que la réponse devrait être seulement celle qui résout votre question ou finalement conduit à cela. J'ai donc accepté votre réponse :) – SDroid

1

Il ressemble à mayb e vous renvoyez votre convertView dans la méthode getView avant que votre AsyncTask ait fini de télécharger l'image. Pouvez-vous utiliser un thread à la place et utiliser la méthode de jointure Thread pour que votre application attende le téléchargement de l'image? Pour une tâche asynchrone, vous utilisez généralement une boîte de dialogue de progression jusqu'à ce que la tâche soit terminée, mais je ne pense pas que vous puissiez le faire à l'intérieur d'un adaptateur.

Que diriez-vous de remplacer ceci:

new ImageDownload().execute(); 

avec ceci:

new Thread(new Runnable() { 
public void run() { 
    try{ 
      Log.e("src",weatherURL); 
      URL url = new URL(weatherURL); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      myBitmap = BitmapFactory.decodeStream(input);  
      Log.e("Bitmap","returned"); 
      return myBitmap; 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      return null; 
     }} 
}).join(); 

puis évidemment se débarrasser de la classe ImageDownload. Je vous jette ça, je ne l'ai pas testé ou quoi que ce soit. Je pense que cela devrait vous rapprocher.

+0

Vous pourriez avoir raison. J'ai essayé d'utiliser 'if (new ImageDownload(). GetStatus() == AsyncTask.Status.TERMINÉ) \t \t { \t \t \t return convertView; Return 0; \t \t \t \t \t return null; 'à la place Thread mais cela n'a pas fonctionné. – SDroid

+0

ouais c'est pourquoi j'évite habituellement AsyncTasks et j'utilise juste des Threads. AsyncTask est comme écouter votre femme parler. Habituellement, vous faites quelque chose d'utile comme jouer à des jeux vidéo ou regarder la télévision, et il y a ce bavardage en arrière-plan, mais vous continuez à faire ce que vous faites de toute façon. Et puis quand elle a presque fini, vous arrêtez ce que vous faites et écoutez la dernière phrase pour que vous puissiez faire comme si vous écoutiez tout le temps ... –

+0

ok je viens d'ajouter un nouveau code à la réponse originale, donnez-lui un essayer. –

Questions connexes