#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);
Надеюсь, это кому-нибудь поможет 🙂