2016-07-22 5 views
0

Я работаю над своим первым приложением и застрял в какой-то момент. В моей MainActivity есть OnClick метод, который связан к кнопке в главном файле макета:Изменить вид на ожидающий экран

<Button 
    android:id="@+id/button" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_below="@+id/IncludeAlbum" 
    android:text="@string/scan" 
    android:onClick="onClick" 
    /> 

Это OnClick:

public void onClick(View view){ 

    view.setVisibility(view.GONE); 

    View v1 = (View) findViewById(id.Welcomemessage); 
    v1.setVisibility(v1.GONE); 

    // 
    // ... many more visibility changes 
    // 

    loaf = new ListOfAudioFiles(); // TAKES TIME 

    ListView lv = (ListView) findViewById(id.listView1); 
    adapter = new CustomAdapter(this, allComparisons); //loaf.songinfos 

    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adpterView, View view, int position, 
           long id) { 
      ListView lv = (ListView) findViewById(R.id.listView1); 

      long viewId = view.getId(); 

      if (viewId == R.id.textView1) { 
       allComparisons.get(position).togglecb1(); 
       adapter.notifyDataSetChanged(); 
      } else { 
       allComparisons.get(position).togglecb2(); 
       adapter.notifyDataSetChanged(); 
      } 

     } 
    }); 

} 

Не очень чистый, я знаю, но Я хотел бы сохранить структуру. Конструктор listofaudiofiles выполняет много времени.

Моя проблема заключается в том, что я не могу изменить представление на какой-либо экран ожидания перед вызовом конструктора listofaudiofiles, также не выполняет (post) работу недействительно и не устанавливает setContentView на новом макете. Изменение вида setText также ничего не дает. Только при заполнении списка отображаются все изменения вида.

Как я могу добиться изменений вида в onClick (...) перед вызовом конструктора ListofAudioFiles, не меняя полностью свою структуру программы?

+0

Это, вероятно, потому, что вы используете свой затянувшийся-метод в потоке пользовательского интерфейса/Убедитесь, что вы используете AsyncTask или другой способ подталкивая операцию работника нить. – vkislicins

+0

Возможно, вам это будет полезно: https://www.youtube.com/watch?v=0Z5MZ0jL2BM&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=2 – vkislicins

ответ

0

Вы не можете изменить представление на что-то вроде экрана ожидания, потому что вы используете конструктор на пользовательском интерфейсе .

Возможно, вы уже догадались об этом, все, что связано с пользовательским интерфейсом, связано с потоком пользовательского интерфейса, в том числе с исчезновением вида, изменением текста и т. Д. Когда вы вызываете трудоемкий конструктор, конструктор фактически выполняется в потоке пользовательского интерфейса , Это означает, что поток пользовательского интерфейса занят загрузкой ваших аудиофайлов (которые он не должен делать). Как он может обновить пользовательский интерфейс (который он должен делать)?

В результате, поток пользовательского интерфейса останавливает обновление пользовательского интерфейса до завершения длительной операции. Для пользователя это выглядит так, что приложение застыло.

Итак, что вы можете сделать? Вы можете либо создать подкласс AsyncTask, либо новый объект Thread. Первый рекомендуется.

Метод onPostExecute в AsyncTask будет вызываться при завершении загрузки аудиофайлов. Вам просто нужно переопределить этот метод, чтобы узнать, когда операция завершена!

Вы можете узнать больше о AsyncTask здесь: https://developer.android.com/reference/android/os/AsyncTask.html