Hesam
Hesam

Reputation: 53600

Android, how to load image from server?

In my app I'm opening a connection to load data. In handset device (Galaxy 2) and tablet p1000 (old 7" tablet with os 2.2) I have no problem and I can get and parse data.

But in another tablet (Samsung 7" plus - Honeycomb) the application crashes. Logcat says:

04-05 16:31:33.905: E/AndroidRuntime(4137): FATAL EXCEPTION: main
04-05 16:31:33.905: E/AndroidRuntime(4137): android.os.NetworkOnMainThreadException
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.net.InetAddress.getAllByName(InetAddress.java:249)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at cam.astro.mania.adapters.NewsAdapter.fetchImages(NewsAdapter.java:105)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at cam.astro.mania.adapters.NewsAdapter.setData(NewsAdapter.java:45)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList.displayData(NewsList.java:359)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList.access$4(NewsList.java:358)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList$MyAsyncTask.onPostExecute(NewsList.java:199)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.astro.mania.activities.NewsList$MyAsyncTask.onPostExecute(NewsList.java:1)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.AsyncTask.finish(AsyncTask.java:590)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.AsyncTask.access$600(AsyncTask.java:149)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.os.Looper.loop(Looper.java:132)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at android.app.ActivityThread.main(ActivityThread.java:4123)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.lang.reflect.Method.invokeNative(Native Method)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at java.lang.reflect.Method.invoke(Method.java:491)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
04-05 16:31:33.905: E/AndroidRuntime(4137):     at dalvik.system.NativeStart.main(Native Method)

my code is:

/*-------------------------------
     * Downloading images from server
     * ------------------------------*/
    private Bitmap[] fetchImages(ArrayList<String> urlstr){
        InputStream is= null;
        Bitmap bm = null;
        Bitmap[] bmList = new Bitmap[urlstr.size()];
        
        try {
            for(int i=0; i<urlstr.size(); i++){
                HttpGet httpRequest = new HttpGet(urlstr.get(i));
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
    
                HttpEntity entity = response.getEntity();
                BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
                is = bufHttpEntity.getContent();
                bm = BitmapFactory.decodeStream(is); 
                bmList[i] = bm;
            }
        }catch ( MalformedURLException e ){
            Log.d( "RemoteImageHandler", "fetchImage passed invalid URL: " + urlstr );
        }catch ( IOException e ){
            Log.d( "RemoteImageHandler", "fetchImage IO exception: " + e );
        }finally{
            if(is!=null)try{
                is.close();
            }catch(IOException e){}
        }
        
        return bmList;
    }

Logcat points to HttpResponse response = (HttpResponse) httpclient.execute(httpRequest). I don't understand what is the meaning of error. What is the problem?

Upvotes: 0

Views: 618

Answers (3)

user834900
user834900

Reputation:

You can you this code to load the image to an imageview.

 ImageView ImageView =(ImageView)dialog.findViewById(R.id.ImageView01);
   InputStream is = null;
   try {
        is = (InputStream) new URL(ClueImgURL).getContent();
    } catch (MalformedURLException e) {
              // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
  Drawable d = Drawable.createFromStream(is, "src name");
  ImageView .setBackgroundDrawable(d);

Here ClueImgURL is the url of the image.

Upvotes: 0

Dimanoid
Dimanoid

Reputation: 7279

Start a new thread for you download and do it there. Inform your main thread via message to Handler or just wait for thread to finish using join()

Upvotes: 0

Jokahero
Jokahero

Reputation: 1074

This error says that you are not allowed to perform networking action in the main thread.

You need to do it in another thread and to get the result back asynchronously.

Hope it helps.

Jokahero

Upvotes: 1

Related Questions