#android
#Android
Вопрос:
Я пытаюсь прочитать 17 изображений из Интернета при отображении заставки. Однако при использовании следующего кода заставка вообще не отображается во время обработки. Он становится черным, завершается и переходит к следующему действию. Я думал, что вызов setContentView перед обработкой кода достаточно хорош, но, видимо, нет.
Чего мне не хватает?
Спасибо за вашу помощь.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
// read the bitmaps
// Open a new URL and get the InputStream to load data from it
// Start reading the XML and filling the arrays
for (int i=0; i<16; i ) {
try {
URL aURL = new URL (districtImage[i]);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
// Buffered is always good for performance
BufferedInputStream bis = new BufferedInputStream(is);
districtBitmap[i] = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
}
catch (IOException e){
Log.e ("DEBUGTAG","Cannot load remote image", e);
}
}
... some more code to transit to next activity...
}
Ответ №1:
Когда вы выполняете сетевые операции внутри onCreate
, вы блокируете поток пользовательского интерфейса до их завершения. До onCreate
возврата на экране ничего не появится. Различные способы избежать этой проблемы см. в статье Безболезненная обработка потоков.
Комментарии:
1. Спасибо за такой быстрый ответ. Позвольте мне прочитать это и вернуться.
2. Прочитайте AsyncTask. Это правильный путь. Спасибо
Ответ №2:
Пытались ли вы выполнить «Начать чтение XML и заполнение массивов» в onResume() вашего действия, а затем перейти к следующему действию? И выполняйте чтение из сети в потоках / асинхронных задачах.
Комментарии:
1. Почему onResume() должен быть задействован, когда что-то выполняется в onCreate()?
2. Пользовательский интерфейс не отображается пользователю до тех пор, пока не будет вызван onResume(). Поэтому держите ваш onCreate() «легким» и выполняйте тяжелые задачи после вызова onResume().
3. Я переместил код в onResume(). Экран становится пустым, вся обработка выполнена, отображается заставка, затем сразу переходите к следующему действию. Единственное отличие в том, что теперь заставка отображается на секунду (я использовал анимацию, чтобы замедлить ее, чтобы я мог ее видеть). Я считаю, что потоковое решение — это способ решения моей проблемы.