2010-12-01 11 views
2

Ich schreibe eine kleine Bilderrahmen App für Android, die OpenGL für einen Teil der Benutzeroberfläche verwendet. Dieser Teil muss Bilder von flickr bekommen und sie in eine Textur laden. Der Code, den ich unten haben, ist funktional die meiste Zeit, aber es hat eine Thread.sleep() Flickschusterei zwischen den Eingangsstrom aus der Verbindung erhalten und die Bitmap-Fabrik Dekodierung des Strom:So laden Sie Bild von URL

  URL url = new URL("http://farm5.static.flickr.com/4132/5168797476_7a85deb2be_b.jpg"); 
      URLConnection con = url.openConnection(); 
      InputStream is = con.getInputStream(); 
      Thread.sleep(250); //What am I actually waiting for? 
      sourceBitmap = BitmapFactory.decodeStream(is); 

Wie bekomme ich um die sleep() -Methode zugunsten von etwas zu verwenden, das logisch Sinn macht?

Ich teste auf einer Registerkarte Samsung Galaxy nicht im Emulator

Antwort

0

Dies scheint weniger als ideal, aber wenn Sie den Stream Byte für Byte in einen Puffer lesen und dann das Byte-Array an die BitmapFactory übergeben, funktioniert es korrekt. auf einmal mit is.read (Bytes, 0, FileLength), aber es hat nicht zuverlässig füllen den Puffer vollständig, wenn ich wartete einen Moment vor dem Aufruf des Lese

  URL url = new URL("http://farm5.static.flickr.com/4132/5168797476_7a85deb2be_b.jpg"); 
      URLConnection con = url.openConnection(); 
      con.connect(); 
      int fileLength = con.getContentLength(); 
      InputStream is = con.getInputStream(); 
      byte[] bytes = new byte[fileLength]; 
      for(int i=0;i<fileLength;i++) { 
       bytes[i] = (byte)is.read(); 
      } 
      sourceBitmap = BitmapFactory.decodeByteArray(bytes, 0, fileLength); 

Ich habe versucht, die Bytes in den Puffer zu lesen. Ist es möglich, dass die Android-Implementierung von InputStreams Lesemethode fehlerhaft ist, was dazu führt, dass die decodeStream-Methode der BitmapFactory aufgrund unvollständiger Daten fehlschlägt?

0

Ich glaube, Sie AsyncTask implementieren sollten. Siehe hierzu: http://developer.android.com/resources/articles/painless-threading.html

public void onClick(View v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 
} 

private class DownloadImageTask extends AsyncTask<string, void,="" bitmap=""> { 
    protected Bitmap doInBackground(String... urls) { 
     return loadImageFromNetwork(urls[0]); 
    } 

    protected void onPostExecute(Bitmap result) { 
     mImageView.setImageBitmap(result); 
    } 
} 

ich hoffe es hilft dir !!

+0

Das asynchrone Herunterladen der Bilder ist natürlich eine gute Idee, die eigentliche Frage wird jedoch nicht behandelt –