2016-12-21 78 views
0

目前我有一個加載活動的按鈕。等待活動顯示

該活動有一個ListView,無論何種原因需要相當長的時間來加載(不等待數據,數據已在內存中)。問題在於,在呈現列表時,UI正在等待按鈕被點擊的位置,並且在列表完全加載之前不會更改屏幕。

我想要的是,只有在活動加載完畢後才顯示列表,所以只要按下按鈕(響應式UI很重要),至少會發生一些事情。

目前,我解決這個問題的方法是產生一個線程,等待50毫秒,然後爲我的列表設置適配器(使用runOnUiThread)。當然,如果活動花費的時間超過50毫秒,需要加載整個列表才能再次加載活動。

當前相關代碼:

@Override 
public void onPostResume() { 
    super.onPostResume(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      final AdapterData data = getData(); 
      try { 
       Thread.sleep(50); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      mActivity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        myAdapter = new MyAdapter(MyActivity.this, data); 
        lvMyList.setAdapter(myAdapter); 
       } 
      }); 
     } 
    }).start(); 
} 

我只是改變變量名中的代碼,但是這並不相關。這只是讓你看到我的一般解決方案。

我覺得應該在活動完成創建時調用某種回調。我認爲onPostResume等待活動完成加載,但沒有奏效。它仍然掛起。

+0

作爲第一個解決方案,我建議創建啓動的活動中靜態公共Runnable的變量,當加載完成後,你可以執行。夠了嗎? –

+0

我不明白你要求我做什麼。 「在加載完成時你可以執行」。我的問題是,我不知道什麼時候加載完成。我知道如何啓動一個可運行的,就像我在發佈的解決方案中看到的那樣。我的問題是知道什麼時候執行它,因爲等待50毫秒感覺像是一個非常糟糕的解決方案 – Cruncher

+0

對不起,也許我不知道什麼時候完全在代碼中的滯後。你是否必須等待getData()結束?或者加載後顯示時間過長?我實際上錯過了這一點,可能是......:/ –

回答

1

可以使用IdleHandler

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.xxx); 
    final AdapterData data = getData(); 
    IdleHandler handler = new IdleHandler() { 

     @Override 
     public boolean queueIdle() { 
      myAdapter = new MyAdapter(MyActivity.this, data); 
      lvMyList.setAdapter(myAdapter); 
      return false; 
     } 
    }; 
    Looper.myQueue().addIdleHandler(handler); 

} 
+0

今天就來試試吧,讓你知道它是如何運作的。感謝您的回答 – Cruncher

+0

嗨,彼得,這似乎處理我需要的東西。非常感謝您的回答。我很驚訝我找不到任何地方的谷歌搜索!快速提問:回報值意味着什麼?你會在什麼情況下返回true? – Cruncher

+0

最後一個問題:這是一個很好的習慣嗎?閒置的處理程序是否經常使用? – Cruncher