2016-10-07 63 views
0

我想編寫一個方法,從對象URL返回位圖圖像。但它給NetworkOnMainThreadException錯誤。從對象URL返回位圖

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; 
     } 
    } 


} 

我不想簡單地從URL顯示位圖圖像,因爲代碼結構different.To防止混淆,我不同意我的所有代碼。我只想寫一個從對象的thumbnailurl獲取位圖的方法。後來我會用這個方法。我從http://jsonplaceholder.typicode.com/得到圖像

+1

您無法在主線程上進行網絡調用,以防您想要加載圖像,Android中有幾個圖像加載器庫,例如:Glide https://github.com/bumptech/glide – hakim

回答

2

你不能在主線程中執行這個網絡任務,你必須在Async任務中寫這個。

寫這個代碼的類內

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) { 
    } 
} 

,並調用它

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

它應該是返回位圖,可能嗎?我怎樣才能返回位圖?因爲當我在課堂上寫作時,它會正常地給出不兼容的類型錯誤。 –

+0

您不能直接從任何異步任務中返回值,只能分配值。 你可以訪問onPostExecute函數中的主線程 –

0

你的問題是,你正在使用的主線程進行網絡操作......而且我建議給使用圖像加載框架來實現這一目標,即使用Glide ..用一行你有該位圖。你不需要解決mainThread ..因爲Glide爲你處理這個問題。只要專注於你的代碼。

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

滑翔:https://github.com/bumptech/glide