2016-04-12 67 views
1

從我一般片段,我有這樣的方法:Android:具有MainLooper的處理程序:「只有創建視圖層次結構的原始線程可以觸及其視圖。」

protected void loadDataListWithDelay() { 
     Handler handler = new Handler(Looper.getMainLooper()); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       loadDataList(); 
      } 
     }, DELAY_START_LOADING); 
    } 

此方法允許開始從服務器的新加​​載數據(與凌空網絡)。

在我loadDataList()方法也有一些看法可見性設置:

protected void loadDataList(String url, ArrayList<BaseFilters> filters, 
           String query, boolean byPassSearchMode) { 
     ... 
     mLoadingDataListView.setVisibility(View.INVISIBLE); 
     mListContainer.setVisibility(View.VISIBLE); 
     ... 

此代碼運行完美,但我今天上午有這樣的碰撞上了Android 6.0.1手機。

你能幫幫我嗎?

+0

我想一個很明顯的問題是,是否有任何片段中的意見可以創建關閉UI線程? – DeeV

回答

0

我會給你一個很好的建議,如果你想做postDelayed,請在你的片段(或任何視圖)中查看一個視圖,並使用它進行postDelay。即textView.postDelayed(..這樣你可以確保你是在UI線程。

+0

但隨着新處理器的機會(Looper.getMainLooper ());是不夠的? – anthony

0

爲什麼不使用runOnUiThread,而不是創建一個新的處理?

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     loadDataList(); 
    } 
}); 

如果需要延遲,那麼你可以使用runOnUiThread內部處理程序

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       loadDataList(); 
      } 
     }, DELAY); 
    } 
}); 
+0

postDelayed是沒有t post –

+0

那麼,夥計們,最好的方法是:user1940343還是Uriel Frankel? – anthony

+0

你可以這樣做。我相信runOnUiThread()是在UI線程上發佈更新的更乾淨的解決方案。 – user1940343

相關問題