Najlepszą praktykę pobierania obrazu należy wykonać na wątku tła, tak aby nie zakłócał głównego wątku, a następnie w razie potrzeby zaktualizować interfejs użytkownika.
public class główną działalność rozciąga AppCompatActivity {
FrameLayout frameLayout;
ImageView imageView;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
frameLayout= (FrameLayout) findViewById(R.id.containerlayout);
imageView= (ImageView) findViewById(R.id.imageView);
progressBar= (ProgressBar) findViewById(R.id.progressBar);
String url="http://www.flat-e.com/flate5/wp-content/uploads/cover-960x857.jpg";
MyTask myTask= new MyTask();
myTask.execute(url);
}
class MyTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected void onPreExecute() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... voids) {
Bitmap bitmap=null;
try {
URL url =new URL(voids[0]);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
InputStream inputStream= connection.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
progressBar.setVisibility(View.GONE);
imageView.setImageBitmap(bitmap);
}
}
}
tu, w tym przykładzie utworzony wewnętrzny klasy MyTask która rozciąga się AsyncTask gdzie zrobiłem wszystkie swoje operacje sieciowe. Upewnij się, że dodasz uprawnienia do wykorzystania w pliku manifestu.
Mam nadzieję, że to działa również dla Ciebie.
Próbuję edytować twój wpis, ale myślę, że jakoś odpowiedź nie jest jeszcze zaktualizowana. Czy możesz dodać uwagę dodatkową w odpowiedzi pogrubioną czcionką, która mówi, że musisz wywołać ten kod z wątku innego niż główny wątek. – VendettaDroid
Ale nie nazwałem tego z wątku i działa dla mnie dobrze. Czy możesz to wyjaśnić. Dziękuję. –
Android ma teraz ścisłą politykę dotyczącą komunikacji sieciowej. Powinieneś spróbować tego kodu ponownie. Zapisany kod może zająć dowolną ilość czasu, aby uzyskać obraz ze zdalnego adresu URL, w zależności od szybkości sieci i rozmiaru obrazu. Jeśli wywołujesz ten kod z interfejsu użytkownika, istnieje szansa, że twój wątek UI zostanie zablokowany i da ci ANR. Wypróbuj ten kod w ICS, jeśli możesz. Prawdopodobnie powinien dać wyjątek "NetWorkOnMainThread". lub możesz po prostu wyszukać w Google tego wyjątku. – VendettaDroid