atul yadav
atul yadav

Reputation: 307

error occured while executing doInBackground()

i want to donload image from server asynchronously but when i run it force close....and gives msg on log cat... An error occured while executing doInBackground()...whats the problem pls help me..pls pls

public class artspacedetailShowingNow extends Activity implements OnClickListener {
    private int imageCounter = 0;

    private ProgressDialog bar;

    private ImageView imageLoader;
    private String[] imageList = {"http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/martin_di_girolamo._diosas/198915-1-esl-AR/MARTIN_DI_GIROLAMO._Diosas.jpg","http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/jorge_macchi._la_espera/198929-1-esl-AR/JORGE_MACCHI._La_espera.jpg","http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/leon_ferrari._hongo_nuclear/198950-1-esl-AR/LEON_FERRARI._Hongo_Nuclear.jpg","http://www.artealdiaonline.com/var/artealdia_com/storage/images/argentina/directorio/galerias/ruth_benzacar/artistas/martin_sastre._fiebre/198922-1-esl-AR/MARTIN_SASTRE._Fiebre.jpg"};
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showingnow);
           imageLoader = (ImageView) findViewById(R.id.imageLoader);
        //imageLoader.setImageResource(image1);

        Button next = (Button) findViewById(R.id.next);
        Button back = (Button) findViewById(R.id.back);
        next.setOnClickListener(this);
        back.setOnClickListener(this);
        back.setEnabled(false);

        new ImageDownload().execute(imageList[imageCounter]); 


    }
@Override
 public void onClick(View v)
{
    String imagePath = null;
       // imagePath = imageList[imageCounter];


    }
    new ImageDownload().execute(imagePath);



}
private void loadImage(String imagePath)

{
      try {

          /* Open a new URL and get the InputStream to load data from it. */

          URL aURL = new URL(imagePath);
          URLConnection conn = aURL.openConnection();
          conn.connect();
          InputStream is = conn.getInputStream();

          /* Buffered is always good for a performance plus. */
          BufferedInputStream bis = new BufferedInputStream(is);

          /* Decode url-data to a bitmap. */
          Bitmap bm = BitmapFactory.decodeStream(bis);

          bis.close();
          is.close();
         imageLoader.setImageBitmap(bm);
         imageLoader.setImageBitmap(bm);
      } catch (IOException e) 
      {

          Log.e("DEBUGTAG", "Remote Image Exception", e);

      }

}
private class ImageDownload extends AsyncTask<String , Void, Void>
{
    @Override
    protected Void doInBackground(String... params) {
        loadImage(params[0]);


       return null;
   }


    @Override
    protected void onPostExecute(Void result) {


    }
    @Override
    protected void onPreExecute() {


    }

}
}

Upvotes: 0

Views: 10150

Answers (3)

Niranj Patel
Niranj Patel

Reputation: 33248

try this

      private class ImageDownload extends AsyncTask<String , Void, Void>
{
    Bitmap imBitmap;
    @Override
    protected Void doInBackground(String... params) {
         try {

              /* Open a new URL and get the InputStream to load data from it. */

              URL aURL = new URL(params[0]);
              URLConnection conn = aURL.openConnection();
              conn.connect();
              InputStream is = conn.getInputStream();

              /* Buffered is always good for a performance plus. */
              BufferedInputStream bis = new BufferedInputStream(is);

              /* Decode url-data to a bitmap. */
              Bitmap bm = BitmapFactory.decodeStream(bis);
              imBitmap=bm;
              bis.close();
              is.close();

          } catch (IOException e) 
          {

              Log.e("DEBUGTAG", "Remote Image Exception", e);

          }


       return null;
   }


    @Override
    protected void onPostExecute(Void result) {
    imageLoader.setImageBitmap(imBitmap);
                 imageLoader.setImageBitmap(imBitmap);

    }
    @Override
    protected void onPreExecute() {


    }

}

you cant use imageLoader.setImageBitmap(imBitmap); in doinBackground.

Upvotes: 2

Jeremy Jem Lee
Jeremy Jem Lee

Reputation: 39

You look like you are accessing your ImageView from within doInBackground. That is not allowed.

Manipulating UI elements can only be done from the UI thread.

If you read AsyncTask, you'll see that doInBackground is executed in another thread, while onPreExecute, onProgressUpdate and onPostExecute is executed in the UI thread.

Handle UI elements in the methods I mentioned above, or post a runnable like TofferJ suggested.

Upvotes: 1

TofferJ
TofferJ

Reputation: 4784

You need to use the UI Thread when doing things that affects the UI. Depending on where the background thread is started from either use:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        imageLoader.setImageBitmap(bm);
        imageLoader.setImageBitmap(bm);
    }
});

or

imageLoader.post(new Runnable() {

    @Override
    public void run() {
        imageLoader.setImageBitmap(bm);
        imageLoader.setImageBitmap(bm);
    }
});

Both of the snippets above will make sure that the correct thread is used to update your UI. Make sure to always do this when modifying the UI (setting images, updating texts etc) from another tread and you will stay out of trouble. :)

Upvotes: 0

Related Questions