2016-07-22 61 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修改視圖也沒有提供任何內容。只有在填充列表時,纔會顯示所有視圖更改。

如何在構造函數調用ListofAudioFiles之前實現onClick(...)中的視圖更改,而不會完全改變我的程序結構?

+0

這可能是因爲你的UI線程上運行的長時間運行法/請確保您使用的AsyncTask或推你的操作工人的另一種方式線。 – vkislicins

+0

您可能會覺得這很有用:https://www.youtube.com/watch?v=0Z5MZ0jL2BM&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=2 – vkislicins

回答

0

因爲您正在運行UI線程上的構造函數,所以無法將視圖更改爲等待屏幕。

您可能已經猜到了,UI相關的一切都是在UI線程上完成的,包括使視圖消失,更改文本等。當您調用耗時的構造函數時,構造函數實際上是在UI線程上執行的。這意味着UI線程正忙於加載您的音頻文件(它不應該這樣做)。它怎麼可能更新UI(它應該這樣做)?

因此,UI線程會停止更新UI,直到完成耗時的操作。對於用戶來說,這看起來應用程序已經凍結。

那麼你能做什麼?您可以創建AsyncTask子類或新的Thread對象。前者是推薦的。

AsyncTask中的onPostExecute方法將在完成加載音頻文件時調用。您只需重寫該方法即可知道操作何時完成!

您可以瞭解更多關於AsyncTask這裏:https://developer.android.com/reference/android/os/AsyncTask.html