Обработка загрузки изображений с URL-адреса

#android #image #drawable

#Android #изображение #можно рисовать

Вопрос:

У меня есть этот код, который извлекает изображение из URL-адреса и отображает его в приложении.

     Drawable drawableTest = LoadImageFromWeb("http://www.someimageurl");
    imgView.setImageDrawable(drawableTest);

private Drawable LoadImageFromWeb(String url){
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    }catch (Exception e) {
        System.out.println("Exc=" e);
        return null;
    }
 }
  

Метод работает, и изображение загружается в приложение без проблем. Я хотел бы сделать две вещи…

1) Переместите процесс в фоновый поток.

2) Во время загрузки изображения отобразите «загружаемый» чертеж (расположенный в папке drawable), а затем переключитесь на изображение, когда закончите. Если есть проблема, я бы хотел загрузить «невозможно загрузить изображение», которое можно нарисовать (также находится в папке drawable).

Может кто-нибудь помочь изменить описанный выше метод, чтобы он работал в фоновом режиме и отображал соответствующие изображения при загрузке и в случае возникновения проблемы?

Спасибо! Кстати, вы, ребята, крутые.

Шеннон

Комментарии:

1. Точный улов здесь: goo.gl/nZivF

Ответ №1:

Вы можете использовать AsyncTask для запуска задачи в другом потоке. Таким образом, он не будет блокировать пользовательский интерфейс. Грубо говоря, это должно быть что-то вроде этого:

 private class MyTask extends AsyncTask<String, Void, Drawable> {

     ProgressDialog pd;

     protected Drawable doInBackground(String... url) {
            try {
                pd = ProgressDialog.show(this, "Working..", "Getting image", true, false);
                InputStream is = (InputStream) new URL(url[0]).getContent();
                Drawable d = Drawable.createFromStream(is, "src name");
                return d;
            } catch (Exception e) {
                System.out.println("Exception = "   e);
                return null;
            }
     }

     protected void onProgressUpdate(Void... progress) {
     }

     protected void onPostExecute(Drawable result) {
         /* Image loaded...*/
         pd.dismiss();
         imgView.setImageDrawable(result);

     }
}

MyTask task = new MyTask();
task.execute("http://www.someimageurl");
  

Вы можете изменить ProgressDialog с любым, что вам нравится…

Комментарии:

1. Это выглядит потрясающе и то, что я хочу заставить работать. Я знаю, что вы сказали примерно, поэтому я подозреваю, что это не завершено. Я пытался реализовать, но получал различные ошибки.. Ошибка скриншотов 1) screencast.com/t/bqowMMfTu0WG , Ошибка 2) screencast.com/t/NAEFwjNe4qa Ошибка 3) screencast.com/t/3AujxtIY Ошибка 4) screencast.com/t/98hg9qJbRqS Есть какие нибудь идеи? Еще раз спасибо LAS_VEGAS! Ценю помощь.

2. Чтобы исправить # 2, вам нужно заменить «this» на ваш «context»

3. Чтобы исправить # 3 и 4, вам нужно поместить код MyTask task = new MyTask(); task.execute("http://www.someimageurl"); в метод!

4. лол… Да, я только что понял это тоже! мой плохой.

5. Понял! Только что заметил ваше исправление. 🙂 Ты потрясающий!

Ответ №2:

Попробуйте этот код…

          Drawable d;
    LoadImageFromWebThread loadImageFromWebThread=new                                     LoadImageFromWebThread(url);
    loadImageFromWebThread.start();
    imgView.setImageDrawable(R.drawable.downloaded);


   class LoadImageFromWebThread extends Thread
   {
       String url; 
       public LoadImageFromWebThread(String url)
       {
           this.url=url;
       }
       @Override
    public void run() {
        // TODO Auto-generated method stub

           try {
                InputStream is = (InputStream) new URL(url).getContent();
                 d = Drawable.createFromStream(is, "src name");
               handler.sendEmptyMessage(0);
            }catch (Exception e) {
                System.out.println("Exc=" e);
                handler.sendEmptyMessage(1);
            }
    }

   }

   final Handler handler = new Handler() {
        public void handleMessage(Message msg) {

            if(msg.what==0)
            {
                imgView.setImageDrawable(d);
            }
            else
            {
                //Error in downloading image
            }
        }
    };
  

Ответ №3:

Я знаю, что поздно начал это обсуждение, но я хотел бы поделиться лучшим найденным мной способом асинхронной загрузки изображений с заданного URL. Я использую библиотеку Android под названием Android Query. Чтобы легко загрузить изображение с помощью Android query, выполните следующие действия:

     // Init Android Query
    AQuery aq = new AQuery(this);
    //fetch and set the image from internet, cache with file and memory 
    aq.id(R.id.image1).image(url);
  

Надеюсь, это кому-нибудь поможет 🙂