2016-05-29 7 views
1

イメージをビットマップ要素にダウンロードしてイメージを持つgridViewにロードしようとしましたが、エラーが発生しても "android.os .NetworkOnMainThreadException "イメージをビットマップファイルにアンドロイドでダウンロードする

検索多くのチュートリアルがありましたが、完成したらImageViewにこの要素を追加しています。 これを行う方法はありますか?しかし、ビットマップにはありますか?

ここで私は私が見つけた非同期なしでダウンロードする方法があります。

URL url = new URL("http://...."); 
Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 

つ以上を:

public static Bitmap getBitmapFromURL(String src) { 
    try { 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     return myBitmap; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

Android load from URL to Bitmap

+0

コードスニペットの1つをスレッドに入れて、その作業を非同期に実行します。 – CommonsWare

+0

申し訳ありませんが、あなたは何を意味するのですか?私はJavaで新しいです – Onelio

+0

https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html http://tutorials.jenkov.com /java-concurrency/creating-and-starting-threads.html – CommonsWare

答えて

0

下記参照、AsyncTaskにあなたのgetBitmapFromURLメソッドをラップ:

private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap> { 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     return getBitmapFromURL(params[0]); 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
    } 
} 

巣あなたの活動への上記AsyncTask

public class MyActivity extends Activity { 
    // To store the Bitmap returned by doInBackground asynctask 
    private Bitmap result; 
    // existing Activity code 
    ... 

    private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap> { 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     return getBitmapFromURL(params[0]); 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     // return the bitmap by doInBackground and store in result 
     result = bitmap; 
    } 
} 

そして、上記のコードを呼び出すために:あなたは、メイン(UI)からのHTTPリクエストのような重い操作を行うことはできません

GetBitmapFromURLAsync getBitmapFromURLAsync = new GetBitmapFromURLAsync(); 
getBitmapFromURLAsync.execute("http://...."); 
+0

しかし、どうすればビットマップを返すことができますか? – Onelio

+0

ビットマップを返す方法に関する答えにコードを追加しました。 –

0

をアンドロイド内のスレッド。または、あなたはそのエラーを取得します。 AsyncTaskを使用できます。

class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> { 

    //this operation is in backgrouund 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     return getBitmapFromURL(params[0]); 
    } 

    //operation is finished, update the UI with bitmap 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
    } 
} 

それともPicassoライブラリを使用し、それがすべてのキャッシュを含め、あなたのために働くありません。

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 
関連する問題