2017-03-15 13 views
-1

インターネットから画像をダウンロードしようとしています。現在、アプリは画像の一部のみをダウンロードしますが、停止します。私はAsyncTaskを使用しています。何をすべきかに関する提案はありますか?Androidからサーバーから画像をダウンロードする

私が手にエラーがある:

android.os.NetworkOnMainThreadException 
at com.example.reynaldo.getimageserver.MainActivity$DownloadAsyncTask.onPostExecute(MainActivity.java:74) 
W/System.err:  at com.example.reynaldo.getimageserver.MainActivity$DownloadAsyncTask.onPostExecute(MainActivity.java:30) 

これは私が持っているコードです:

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ImageView; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 

public class MainActivity extends AppCompatActivity { 

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

public void onClick (View view){ 
    DownloadAsyncTask task = new DownloadAsyncTask(); 
    task.execute(new String[] {"http://res.cloudinary.com/demo/image/upload/w_500,f_auto/sample.jpg" }); 
} 

private class DownloadAsyncTask extends AsyncTask<String, Void, String> { 


    Bitmap bitmap = null; 
    InputStream in = null; 

    @Override 
    protected String doInBackground(String... urls){ 


     int response = -1; 
     URL url; 

     try { 
      url = new URL("http://res.cloudinary.com/demo/image/upload/w_500,f_auto/sample.jpg"); 

     URLConnection conn = url.openConnection(); 

     if (!(conn instanceof HttpURLConnection)) 
      System.out.println("This is wrong"); 


     HttpURLConnection httpConn = (HttpURLConnection) conn; 
     httpConn.setAllowUserInteraction(false); 
     httpConn.setInstanceFollowRedirects(true); 
     httpConn.setRequestMethod("GET"); 
     httpConn.connect(); 

     response = httpConn.getResponseCode(); 
     if (response == HttpURLConnection.HTTP_OK) { 
      in = httpConn.getInputStream(); 
      return "success"; 
     } 
     } 

    catch (IOException e) { 
     System.out.println("IOException"); 
    } 
     return "Download failed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     //try { 
      bitmap = BitmapFactory.decodeStream(in); 
     /* in.close(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     }*/ 
     ImageView img = (ImageView) findViewById(R.id.image); 

     img.setImageBitmap(bitmap); 
    } 

} 

}

+0

一つの問題は、AsyncTaskのonPostExecuteは、()UIスレッド上で実行され、あなたがUIスレッド上でのネットワーキングを行うことができない。あるAsyncTaskクラスを作成します。 doInBackground()の内部でビットマップをデコードし、onPostExecute()でビューに渡すことができます。 – Code4aliving

+0

または、ピカソのようなイメージダウンローダー – theblitz

+0

イメージダウンローダーのためにピカソまたはレトロフィットを使用することができます。 – HaroldSer

答えて

0

サードパーティのライブラリ

を使用したくない場合は、これを試してください
 new DownloadImage(Imageview).execute(YourUrl); 

public class DownloadImage extends AsyncTask<String, Void, Bitmap> { 
    CircleImageView bmImage; 

    public DownloadImage(ImageView bmImage) { 
     this.bmImage = (CircleImageView) bmImage; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.d("Error", e.getStackTrace().toString()); 

     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
    } 
} 
関連する問題