3

I am trying to download and show a image in my imageview from URL that i will get dyncamically .I have tried this way

 URL url = new URL(parsedWeatherResponse.getWeatherIconUrl());
            Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            weather_image.setImageBitmap(bmp);

But it showing exception that is

10-04 12:22:40.221: E/AndroidRuntime(15097): FATAL EXCEPTION: main
10-04 12:22:40.221: E/AndroidRuntime(15097): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.itintestapp/com.example.itintestapp.MainActivity}: android.os.NetworkOnMainThreadException
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.ActivityThread.access$600(ActivityThread.java:149)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.os.Looper.loop(Looper.java:153)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.ActivityThread.main(ActivityThread.java:4987)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at java.lang.reflect.Method.invokeNative(Native Method)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at java.lang.reflect.Method.invoke(Method.java:511)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at dalvik.system.NativeStart.main(Native Method)
10-04 12:22:40.221: E/AndroidRuntime(15097): Caused by: android.os.NetworkOnMainThreadException
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1125)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at com.example.itintestapp.MainActivity.setSectorData(MainActivity.java:64)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at com.example.itintestapp.MainActivity.onCreate(MainActivity.java:40)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.Activity.performCreate(Activity.java:5020)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
10-04 12:22:40.221: E/AndroidRuntime(15097):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
10-04 12:22:40.221: E/AndroidRuntime(15097):    ... 11 more

Please help me how couuld i do this .I have show a image from a URL

I have tried this way

class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
      ImageView bmImage;

      public DownloadImageTask(ImageView bmImage) {
          this.bmImage = 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.e("Error", e.getMessage());
              e.printStackTrace();
          }
          return mIcon11;
      }

      protected void onPostExecute(Bitmap result) {
          bmImage.setImageBitmap(result);
      }
    }

Calling

 new DownloadImageTask((ImageView) findViewById(R.id.weather_image))
            .execute(parsedWeatherResponse.getWeatherIconUrl());

Getting this exception

10-04 12:29:14.298: E/AndroidRuntime(15813): FATAL EXCEPTION: main
10-04 12:29:14.298: E/AndroidRuntime(15813): java.lang.NullPointerException
10-04 12:29:14.298: E/AndroidRuntime(15813):    at com.example.itintestapp.DownloadImageTask.onPostExecute(DownloadImageTask.java:32)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at com.example.itintestapp.DownloadImageTask.onPostExecute(DownloadImageTask.java:1)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at android.os.AsyncTask.finish(AsyncTask.java:631)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at android.os.Looper.loop(Looper.java:153)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at android.app.ActivityThread.main(ActivityThread.java:4987)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at java.lang.reflect.Method.invokeNative(Native Method)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at java.lang.reflect.Method.invoke(Method.java:511)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
10-04 12:29:14.298: E/AndroidRuntime(15813):    at dalvik.system.NativeStart.main(Native Method)
Raghunandan
  • 132,755
  • 26
  • 225
  • 256

4 Answers4

2

You are running the network related operation on the ui thread. So, you get NetworkOnMainThreadException.

Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

You should use a Thread or Asynctask.

http://developer.android.com/reference/android/os/AsyncTask.html.

Check the docs there is an example.

Example:

public class MainActivity extends Activity {
    ImageView iv ;
    ProgressDialog pd; 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    pd = new ProgressDialog(this);
    pd.setMessage("Downloading Image");
    iv = (ImageView) findViewById(R.id.imageView1);
    Button b1 = (Button) findViewById(R.id.button1);
    b1.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
             new DownloadImageTask(iv).execute("http://a3.twimg.com/profile_images/740897825/AndroidCast-350_normal.png");
        }

    });

}
class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd.show();
    }

    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.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    @Override 
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        pd.dismiss();
        bmImage.setImageBitmap(result);
    }
  }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="171dp"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="78dp"
        android:text="Button" />

</RelativeLayout>

Snap

enter image description here

Yiannis Tsimalis
  • 739
  • 2
  • 11
  • 23
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
2

You're getting NetworkOnMainThreadException which indicates that you're performing network operation on main thread, while it should be performed in other thread.

Follow this question for further information: How to fix android.os.NetworkOnMainThreadException?

Community
  • 1
  • 1
Piotr Chojnacki
  • 6,837
  • 5
  • 34
  • 65
1

As you are running Network Related work on MainThread i.e. UIThread which cause UIThread not to laid out it's Viewon Screen or Activity. That's according to ThreadPolicy all the time consuming and variable operation are need to performed on AysncTask or Thread.

As per below LongOperation is AsyncTask which can be executed by calling execute() on it.

new LongOperation().execute();  

private class LongOperation extends AsyncTask<String, Void, Bitmap> {

      @Override
      protected String doInBackground(Bitmap... params) 
      {
       try 
          {
          URL url = new URL(parsedWeatherResponse.getWeatherIconUrl());
          Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
          } 
       catch (InterruptedException e) {
          // TODO Auto-generated catch block
            e.printStackTrace();
           }
       return bmp;
      }      

      @Override
      protected void onPostExecute(Bitmap bmp) 
      {
       super.onPostExecute(result);
       weather_image.setImageBitmap(bmp);
       }

      @Override
      protected void onPreExecute() {
      }

      @Override
      protected void onProgressUpdate(Void... values) {
      }
}   
Vikalp Patel
  • 10,669
  • 6
  • 61
  • 96
0

You can directly show image from web without downloading it. Please check the below function . It will show the images from the web into your image view.

public static Drawable LoadImageFromWebOperations(String url) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    } catch (Exception e) {
        return null;
    }
}

then set image to imageview using code in your activity.

Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300
  • The exception you got is clearly saying that you cannot have a network operation on the UI thread. Have AsyncTask instead. Call this method in an AsyncTask. I just show the code inside doInBackground – Zar E Ahmer Dec 17 '14 at 07:23