2013-03-05 2 views
0

Я использую URL-адрес изображения для представления изображения в изображении, но мое приложение для Android бросает следующее исключение. Я использую асинхронную задачу для получения URL-адреса изображения и помещения его в режим просмотра изображений в методе onpostexecute().Изображение изображение из imageurl, дающее исключение

Mycode

protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      ImageView i=(ImageView)findViewById(R.id.imageView1); 
      Bitmap bitmap; 
      Drawable d; 
      try { 
       bitmap = BitmapFactory.decodeStream((InputStream)new URL(logo.get(0)).getContent()); 
       i.setImageBitmap(bitmap); 


      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

LogCat exeception

03-05 06:34:25.148: E/AndroidRuntime(1653): FATAL EXCEPTION: main 
03-05 06:34:25.148: E/AndroidRuntime(1653): android.os.NetworkOnMainThreadException 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.net.URLConnection.getContent(URLConnection.java:190) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.net.URL.getContent(URL.java:447) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at com.example.slideoutmenu.LayerStack$logo.onPostExecute(LayerStack.java:249) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at com.example.slideoutmenu.LayerStack$logo.onPostExecute(LayerStack.java:1) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.os.Looper.loop(Looper.java:137) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-05 06:34:25.148: E/AndroidRuntime(1653):  at dalvik.system.NativeStart.main(Native Method) 

как я могу показать изображение из ImageUrl.

ответ

3

onPostExecute() метод работает на потоке пользовательского интерфейса. Вы должны переместить следующую строку в метод doInBackground().

bitmap = BitmapFactory.decodeStream((InputStream)new URL(logo.get(0)).getContent());

+0

Спасибо за быстрый ответ –

+0

я установить ширину изображений-View, как матч-родитель, но изображение не соответствует родителю –

+0

в ImageView теге вашего макета XML, добавьте это: 'андроида : scaleType = "fitXY" ' –

0

NetworkOnMainThreadException.

Вы работаете в сети по этому методу onPostExecute(), которые работают по главной теме. Прочитано here.

Проделайте эту операцию в этом методе doInBackground().

+1

Спасибо за быстрый ответ –

1

Попробуйте следующий код, который эффективно использовать для сетевой задачи.

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 
    private String data; 

    public BitmapWorkerTask(ImageView imageView) { 
     // Use a WeakReference to ensure the ImageView can be garbage 
     // collected 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    // Decode image in background. 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     data = params[0]; 
     try { 
      return BitmapFactory.decodeStream((InputStream) new URL(data) 
        .getContent()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

И использовать этот класс, используйте следующую инструкцию.

ImageView img = (ImageView) findViewById(R.id.imageView1); 
BitmapWorkerTask task = new BitmapWorkerTask(img); 
task.execute("your image url"); 
+1

Спасибо за быстрый ответ –