2014-11-16 53 views
0

下载图像我要创建一个简单的Android应用程序从互联网 活动代码看起来像这样获取的图像:机器人 - (HttpURLConnection类)从互联网上

import java.io.IOException; 
import java.io.InputStream; 

import android.support.v7.app.ActionBarActivity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class BitmapDemo extends ActionBarActivity { 
    //bikin objek image view nya 
    ImageView imageview; 

    private Bitmap downloadImage(String url){ 
     Bitmap bitmap = null; 
     InputStream in = null; 
     Koneksi koneksi = new Koneksi(); //class untuk koneksi nya 

     try{ 
      in = koneksi.OpenHttpConnection(url); 
      bitmap = BitmapFactory.decodeStream(in); 
      in.close(); 
     } 
     catch(IOException ex){ 
      Toast.makeText(this, ex.getLocalizedMessage(),Toast.LENGTH_LONG).show(); 
      ex.printStackTrace(); 
     } 

     return bitmap; 
    } 

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

     //download image nya 
     //Bitmap bitmap = downloadImage("http://10.0.3.2/mp/tux2.jpeg"); //localhost 
     Bitmap bitmap = downloadImage("http://infinitejest.wallacewiki.com/david-foster-wallace/images/a/ab/Nasa_Emblem.jpg"); //localhost 
     //Bitmap bitmap = downloadImage("nama saya luki"); //localhost 
     imageview = (ImageView)findViewById(R.id.imageview); 
     imageview.setImageBitmap(bitmap); 
    } 

并进行连接,我创建了一个所谓Koneksi.java类(称为在活动上线22

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

//import org.apache.http.HttpConnection; 

public class Koneksi { 
    public InputStream OpenHttpConnection(String urlString) throws IOException{ 
     InputStream in = null; 
     int response = -1; 

     URL url = new URL(urlString); 
     final URLConnection conn = url.openConnection(); 

     if(!(conn instanceof HttpURLConnection)){ 
      throw new IOException("String yang dimasukkan bukan alamat web"); 
     } 

       try{ 
        HttpURLConnection httpCon = (HttpURLConnection) conn; 
        httpCon.setAllowUserInteraction(false); 
        httpCon.setInstanceFollowRedirects(true); 
        httpCon.setRequestMethod("GET"); 
        httpCon.connect(); 

        //apakah respon berhasil 
        response = httpCon.getResponseCode(); 
        if(response == HttpURLConnection.HTTP_OK){ //sama dengan 200 ga ya 
         in = httpCon.getInputStream(); 
        } 
       } 

       catch(Exception ex){ 
        //ex.printStackTrace(); 
        throw new IOException("koneksi error"); 
       } 

     return in; 
    } 
} 

当我执行的应用程序,在Koneksi.java捕捉抛出,说:“koneksi错误”。我失去了什么?

注意:我已经在清单中添加了“android.permission.ACCESS_NETWORK_STATE”和“android.permission.INTERNET”

+0

什么是''响应的价值? –

+0

在catch块中取消注释'ex.printStackTrace();'并在logcat中查看它打印的内容。 –

+0

没有logcat,我只能告诉你,主要是它的NetworkOnMainThread异常。您需要使用AsyncTask来执行此操作。 –

回答

1

您已经添加的权限。精细。但你需要创建AsyncTask来执行此操作。

您正在尝试访问主线程上的网络。

您Koneksi类更改为的AsyncTask:

private class Koneksi extends AsyncTask<String, Integer, String> { 

    protected String doInBackground(String... params) { 
     //your code for downloading image  
    } 

    protected void onPostExecute(String result) { 
     //handle result 
    } 
} 

称其为:

new Koneksi().execute(params); //params is a String array of input if any. 

希望这有助于。

+1

男人,你救了我的一天,谢谢! :) – thekucays

0

在Android中,您无法从主线程打开网络连接。 用户界面在主线程上运行,因此每个连接都会中断该界面,并且在执行下载时不能执行任何操作。

您必须构建一个辅助类,它在后台连接并在下载完成时执行回调。

在这里看到:Perform Network Operations on a Separate Thread

1

你一个快速简便的方法:

public class MyRunnable implements Runnable{ 

    private String url; 
    public MyRunnable (String _url){ 
     url=_url; 
    } 

    @Override 
    public void run() { 
     final Bitmap bitmap; 
     InputStream in = null; 
     Koneksi koneksi = new Koneksi(); //class untuk koneksi nya 

     try{ 
      in = koneksi.OpenHttpConnection(url); 
      bitmap = BitmapFactory.decodeStream(in); 
      in.close(); 
     } 
     catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
     BitmapDemo.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       imageview = (ImageView) findViewById(R.id.imageview); 
       imageview.setImageBitmap(bitmap); 
      } 
     }); 
    } 
} 

并在代码:

private Bitmap downloadImage(String url){ 
    Thread t = new Thread(new MyRunnable(url)); 
    t.start(); 
}