пользовательский интерфейс Android не отображается при обработке других данных

#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(). Экран становится пустым, вся обработка выполнена, отображается заставка, затем сразу переходите к следующему действию. Единственное отличие в том, что теперь заставка отображается на секунду (я использовал анимацию, чтобы замедлить ее, чтобы я мог ее видеть). Я считаю, что потоковое решение — это способ решения моей проблемы.