2013-03-19 128 views
9

我使用v4 support libFragmentTabHostFragmenttabhost性能很慢?

的要求是,當我切換標籤彼此&另外一個,那就是呼籲

onCreateView()& onActivityCreated()每次。

這就是爲什麼我的代碼性能很慢。

那麼,還有其他解決方案嗎?如何提高片段選項卡的性能?

+0

你可以從'onCreateView()'和'onActivityCreated()'發佈代碼嗎? – Darwind 2013-04-18 17:33:50

+0

你在片段中嘗試過setRetainInstance(true)嗎? – Greensy 2013-04-24 15:16:00

回答

1

我找到了解決方案。我在創建時插入了所有websevices &數據庫事務代碼。因爲在每次不召喚時都會打電話給ondestroy不打電話。 &另一個解決方案也可用我們可以使用

fragment.show();

& fragment.hide();方法

+1

聽起來像你有正確的想法。但是,最終目標是碎片不應該與他們的活動交談來檢索數據。他們應該被賦予必要的所有資源引用自己獲取他們的數據。畢竟這是碎片的重點。活動僅僅是負責初始化和導航的容器。 – dcow 2013-04-26 20:09:42

+0

@saunik唱:你可以告訴我必須使用fragment.show()和fragment.hide()。我必須重寫onTabChanged函數? – 2014-07-24 13:04:52

9

聽起來像設計的氣味。

重新設計您的代碼,以便繁重的工作異步完成。應該能夠快速構建碎片。如果爲了使片段顯示有用的信息而需要做大量的處理,那麼應該在創建片段之後事先或者異步地完成該工作,並且在工作完成時應該通知片段來更新其內容。

+3

同意。如果'onCreateView()'或'onActivityCreated()'花費了幾個毫秒的時間,那麼你做錯了。確切的原因確實是 – CommonsWare 2013-04-21 13:40:35

+1

! – 2013-04-22 08:52:16

1

你應該關心的第一件事是關於計算/加載一大組數據應該放在與主UI線程不同的工作線程上。最好的選擇(我認爲)是使用AsyncTask。您可以使用這樣的事情在你的片段:

private class LoadData extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      // this is the place where you can show 
      // progressbar for example to indicate the user 
      // that there is something which is happening/loading in the background 
     } 

     @Override 
     protected void doInBackground(Void... params){ 

      // that's the place where you should do 
      // 'the heavy' process which should run on background thread 
     } 

     @Override 
     protected void onPostExecute(Void result){ 
      super.onPostExecute(); 
      // you should update your UI here. 
      // For example set your listview's adapter 
      // changes button states, set text to textview and etc. 
     } 
} 

這是你可以讓你的標籤的工作faster.Hope這將幫助你的方式! :)

0

作爲Android開發者的補充:如果您已經在使用AsyncTask,請記住,即使您使用多個AsyncTask,它們也會在後臺執行,但都是按順序執行!如果你想要更多的線程來處理你的任務,看看這個帖子,這完全解釋瞭如何實現! Running multiple AsyncTasks at the same time -- not possible?

+1

這取決於您正在運行的版本和設備硬件。異步任務在線程池中執行,其中簡單情況是1個工作線程的池。這也是該框架某些版本的默認值。 – dcow 2013-12-02 20:57:17