To jest niesamowite. I powinno być znacznie wyżej na liście. Asynctask umożliwia ładowanie bez zamrażania interfejsu użytkownika!
Kyle Clegg,
3
AsyncTasks używa szeregowego modułu wykonującego, co oznacza, że każdy obraz ładuje się jeden po drugim i nie wykonuje równoległego ładowania wątków.
Blundell
2
Link źródłowy już nie działa ...
hecvd
10
Strumień wejściowy nie jest zamknięty w twoim przykładzie. Najlepiej zrobić w ostatnim bloku twojego try / catch.
Risadinha,
2
Czy ta metoda jest nadal aktualna? Jestem trochę zdezorientowany co do metody OnClick () i jej celu
tccpg288
170
1. Picasso umożliwia bezproblemowe ładowanie obrazu w aplikacji - często w jednym wierszu kodu!
Więc jeśli adres URL to localhost, oznacza to, że obraz znajduje się w bazie danych serwera lokalnego rozwijającego się systemu, np. Xampp, nadal mogę pobrać obraz z adresu URL =.
blackjack
2
@blackjack - localhost z aplikacji byłby samym smartfonem. Aby uzyskać dostęp do rozwijającego się systemu, smartfon i rozwijający się system będą musiały znajdować się w tej samej sieci i będziesz musiał użyć adresu IP swojego rozwijającego się systemu w tej sieci.
Ridcully,
1
czy można użyć Picassa do załadowania obrazu na przycisku?
mahdi,
1
@chiragkyada próbuję z tym kodem Picasso.with (kontekst) .load (url) .into (widok_przycisku); ale wyświetla błąd dla: do (widok_przycisku)
masz rację. ale tylko te 3 linie pomagają rozwiązać problem. URL newurl = nowy adres URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); dziękuję za twoją odpowiedź.
Praveen
2
W przypadku adresu URL - import java.net.URL; prywatny statyczny końcowy int IO_BUFFER_SIZE = 4 * 1024; jaki był ostatni?
UrlImageViewHelper wypełni ImageView obrazem znalezionym pod adresem URL.
Próbka przeprowadzi wyszukiwanie grafiki Google i załaduje / pokaż wyniki asynchronicznie.
UrlImageViewHelper automatycznie pobierze, zapisze i zbuforuje wszystkie adresy URL obrazów BitmapDrawables. Zduplikowane adresy URL nie zostaną załadowane dwukrotnie do pamięci. Pamięć bitmapowa jest zarządzana przy użyciu słabej referencyjnej tabeli skrótów, więc gdy tylko obraz nie będzie już używany, zostanie automatycznie wyrzucony.
mm .. nie można tego zrobić z wątku interfejsu użytkownika.
Guy
2
W przypadku osób, które mają problemy z „Wyjątkiem zniekształconego adresu URL”, otocz powyższe linie w try / catch. stackoverflow.com/a/24418607/2093088
Riot Goes Woof
1
Należy to zrobić za pomocą AsyncTask, jak opisano powyżej
B-GangsteR
63
Przyjęta powyżej odpowiedź jest świetna, jeśli ładujesz obraz na podstawie kliknięcia przycisku, ale jeśli robisz to w nowej aktywności, zawiesza interfejs użytkownika na sekundę lub dwie. Rozglądając się, zauważyłem, że prosta asynchronizacja wyeliminowała ten problem.
Aby użyć asynctask, dodaj tę klasę na końcu swojej aktywności:
Ładna próbka, ale nie sądzę, że jest to bezpieczne dla wątków. Próbuję użyć go w Async na onPostExecute, jednak onPostExecute może czasem zakończyć się przed otrzymaniem wywołania zwrotnego renderując pusty obraz.
Jimmy
To zarządza własnym wątkiem. Dlaczego więc nie poprosić ASyncTask o oddzwonienie do interfejsu użytkownika, gdy zakończy się, z wybranym adresem URL. W ten sposób nie masz nici spawnujących wątki.
Moim zdaniem najlepsza współczesna biblioteka do takiego zadania to Picasso by Square. Pozwala załadować obraz do ImageView według adresu URL za pomocą jednej linijki:
Niedawno znalazłem tutaj wątek , ponieważ muszę zrobić podobną rzecz dla widoku listy z obrazami, ale zasada jest prosta, jak można przeczytać w pierwszej pokazanej tam klasie próbki (autorstwa Jleedev). Otrzymujesz strumień wejściowy obrazu (z sieci)
Następnie przechowujesz obraz jako Drawable i możesz przekazać go do ImageView (przez setImageDrawable). Znów z górnego fragmentu kodu spójrz na cały wątek.
Wiele dobrych informacji tutaj ... Niedawno znalazłem klasę o nazwie SmartImageView, która jak dotąd wydaje się działać naprawdę dobrze. Bardzo łatwy do włączenia i użytkowania.
To jest późna odpowiedź, jak sugeruje to powyżej AsyncTask, a po googlowaniu znalazłem jeszcze jeden sposób na rozwiązanie tego problemu.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Oto pełna funkcja:
publicvoid loadMapPreview (){//start a background thread for networkingnewThread(newRunnable(){publicvoid run(){try{//download the drawablefinalDrawable drawable =Drawable.createFromStream((InputStream)new URL("url").getContent(),"src");//edit the view in the UI thread
imageView.post(newRunnable(){publicvoid run(){
imageView.setImageDrawable(drawable);}});}catch(IOException e){
e.printStackTrace();}}}).start();}
Nie zapomnij dodać następujących uprawnień w AndroidManifest.xmlcelu uzyskania dostępu do Internetu.
To jest naprawdę bardzo miłe dla minimalizmu! Pamiętaj tylko, że należy uruchomić dodatkowo, Threadponieważ wątek interfejsu użytkownika nie pozwala na operacje sieciowe.
creativecreatorormaybenot
6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
Spróbuj w ten sposób, mam nadzieję, że pomoże ci to rozwiązać problem.
Tutaj wyjaśniam, jak używać biblioteki zewnętrznej „AndroidQuery” do ładowania obrazu z adresu URL / serwera w sposób asynchroniczny, a także załadować obraz z pamięci podręcznej do pliku urządzenia lub obszaru pamięci podręcznej.
publicclassMainActivityextendsActivity{privateAQuery aQuery;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aQuery =newAQuery(this);
aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);}}Note:Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by"AndroidQuery"to load your image easily.
Odpowiedzi:
Od programisty Androida :
Upewnij się, że masz ustawione następujące uprawnienia
AndroidManifest.xml
dostępu do Internetu.źródło
1. Picasso umożliwia bezproblemowe ładowanie obrazu w aplikacji - często w jednym wierszu kodu!
Użyj Gradle:
Tylko jedna linia kodu!
2. Szybkość Biblioteka ładowania i buforowania obrazu dla Androida skupia się na płynnym przewijaniu
Użyj Gradle:
// Dla prostego widoku:
3. Fresk to potężny system do wyświetlania obrazów w aplikacjach na Androida. Fresk dba o ładowanie i wyświetlanie obrazów, więc nie musisz.
Pierwsze kroki z Fresco
źródło
Najpierw musisz pobrać obraz
Następnie użyj Imageview.setImageBitmap, aby ustawić bitmapę w ImageView
źródło
Napisałem klasę, aby sobie z tym poradzić, ponieważ wydaje się, że jest to powtarzająca się potrzeba w moich różnych projektach:
https://github.com/koush/UrlImageViewHelper
źródło
W każdym razie ludzie proszą mój komentarz o opublikowanie go jako odpowiedzi. piszę.
źródło
Przyjęta powyżej odpowiedź jest świetna, jeśli ładujesz obraz na podstawie kliknięcia przycisku, ale jeśli robisz to w nowej aktywności, zawiesza interfejs użytkownika na sekundę lub dwie. Rozglądając się, zauważyłem, że prosta asynchronizacja wyeliminowała ten problem.
Aby użyć asynctask, dodaj tę klasę na końcu swojej aktywności:
I wywołaj z metody onCreate (), używając:
Rezultatem jest szybko wczytana aktywność i podgląd obrazu, który pokazuje ułamek sekundy później w zależności od prędkości sieci użytkownika.
źródło
Możesz także użyć tego widoku LoadingImageView, aby załadować obraz z adresu URL:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Po dodaniu pliku klasy z tego łącza można utworzyć instancję widoku obrazu adresu URL:
w xml:
W kodzie:
I zaktualizuj za pomocą:
źródło
źródło
Cześć Mam najłatwiejszy kod, spróbuj tego
main.xml
Spróbuj tego
źródło
Moim zdaniem najlepsza współczesna biblioteka do takiego zadania to Picasso by Square. Pozwala załadować obraz do ImageView według adresu URL za pomocą jednej linijki:
źródło
Niedawno znalazłem tutaj wątek , ponieważ muszę zrobić podobną rzecz dla widoku listy z obrazami, ale zasada jest prosta, jak można przeczytać w pierwszej pokazanej tam klasie próbki (autorstwa Jleedev). Otrzymujesz strumień wejściowy obrazu (z sieci)
Następnie przechowujesz obraz jako Drawable i możesz przekazać go do ImageView (przez setImageDrawable). Znów z górnego fragmentu kodu spójrz na cały wątek.
źródło
Wiele dobrych informacji tutaj ... Niedawno znalazłem klasę o nazwie SmartImageView, która jak dotąd wydaje się działać naprawdę dobrze. Bardzo łatwy do włączenia i użytkowania.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
AKTUALIZACJA : Skończyło się na tym , że napisałem post na blogu , więc sprawdź ją, aby uzyskać pomoc na temat korzystania ze SmartImageView.
2ND UPDATE : Teraz zawsze używam do tego Picassa (patrz wyżej) i bardzo go polecam. :)
źródło
To jest późna odpowiedź, jak sugeruje to powyżej
AsyncTask
, a po googlowaniu znalazłem jeszcze jeden sposób na rozwiązanie tego problemu.Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Oto pełna funkcja:
Nie zapomnij dodać następujących uprawnień w
AndroidManifest.xml
celu uzyskania dostępu do Internetu.<uses-permission android:name="android.permission.INTERNET" />
Próbowałem tego sam i nie mam jeszcze żadnych problemów.
źródło
Thread
ponieważ wątek interfejsu użytkownika nie pozwala na operacje sieciowe.źródło
Pomoże ci to ...
Zdefiniuj podgląd obrazu i załaduj do niego obraz .....
Następnie Zdefiniuj tę metodę:
źródło
źródło
Wersja z obsługą wyjątków i zadaniem asynchronicznym:
źródło
źródło
Prostym i czystym sposobem na to jest użycie biblioteki open source Prime .
źródło
Ten kod jest testowany, działa całkowicie.
źródło
Praca dla imageView w dowolnym kontenerze, takim jak widok siatki widoku listy, normalny układ
źródło
Spróbuj w ten sposób, mam nadzieję, że pomoże ci to rozwiązać problem.
Tutaj wyjaśniam, jak używać biblioteki zewnętrznej „AndroidQuery” do ładowania obrazu z adresu URL / serwera w sposób asynchroniczny, a także załadować obraz z pamięci podręcznej do pliku urządzenia lub obszaru pamięci podręcznej.
Activity_main.xml
MainActivity.java
źródło
Android Query poradzi sobie z tym i wiele innych (takich jak pamięć podręczna i postęp ładowania).
Spójrz tutaj .
Myślę, że to najlepsze podejście.
źródło