2016-10-07 4 views
0

Ich möchte eine Methode schreiben, die Bitmap-Bild von Objekt-URL zurückgibt. Aber es gibt NetworkOnMainThreadException Fehler.Bitmap aus Objekt-URL zurückgeben

Image.java:

package gc.x.models; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.widget.ImageView; 

import com.google.gson.annotations.SerializedName; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import gc.x.R; 


/** 
* Created by ASUS on 4.10.2016. 
*/ 
public class Image { 


    public String albumId; 
    public String id; 
    public String title; 
    public String url; 
    public String thumbnailUrl; 


    public Bitmap getBitmapFromURL() {//get bitmap of thumbnail from thumbnailurl 
     try { 
      URL url = new URL(this.thumbnailUrl); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 
     } catch (IOException e) { 
      // Log exception 
      return null; 
     } 
    } 


} 

Ich will nicht einfach aus url Bitmap-Bild zeigen, weil Codestruktur Verwirrung different.To zu verhindern ist, habe ich nicht meine alle Codes teilen. Ich möchte nur eine Methode schreiben, die Bitmap aus der Thumbnailurl des Objekts bekommt. Später werde ich diese Methode verwenden. Ich bekomme Bilder von http://jsonplaceholder.typicode.com/

+1

Sie können nicht Netzwerk-Aufruf auf Haupt-Thread tun, falls Sie Bild laden möchten gibt es mehrere Bild-Loader-Bibliothek in Android, zum Beispiel: Glide https://github.com/bumptech/glide – hakim

Antwort

2

Sie können diese Netzwerkaufgabe nicht im Hauptthread ausführen, Sie müssen dies innerhalb der Async-Aufgabe schreiben.

schreiben Dieser Code innerhalb der Klasse

private class AsyncClass extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     getBitmapFromURL(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
    } 
} 

und nennen Sie es wie diese

new AsyncClass().execute(""); 
+0

Es sollte Bitmap zurückkehren, ist das möglich? Wie kann ich eine Bitmap zurückgeben? Weil es normalerweise inkompatible Typen gibt, wenn ich in die Klasse schreibe. –

+0

Sie können keinen Wert von Async-Tasks direkt zurückgeben, Sie können nur Werte zuweisen. Sie können auf den Haupt-Thread in der onPostExecute-Funktion zugreifen –

0

Ihr Problem ist, dass Sie Haupt-Thread für den Netzbetrieb verwenden ... Außerdem würde ich vorschlagen, Verwenden Sie das Image Load Framework, um dieses Ziel zu erreichen, dh verwenden Sie Glide .. mit einer Zeile haben Sie diese Bitmap. Sie müssen mainThread nicht lösen, da Glide sich darum kümmert. Konzentrieren Sie sich auf Ihren Code.

Bitmap theBitmap = Glide.with(this). 
       load("http://...."). // or url 
       asBitmap(). 
       into(100, 100). // Width and height 
       get(); 

Glide: https://github.com/bumptech/glide

Verwandte Themen