2014-11-16 4 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

uncomment 'ex.printStackTrace();' в блоке catch и посмотреть в 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(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^