2016-11-15 40 views
0

通常我這樣做:在Android生命週期內從後臺線程加載數據的正確方法是什麼?

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //initialize variables, set values from argument bundle, etc 
    List<SomeObject> list = someIntenseDataLoadingProcess(); 
    adapter = new Adapter(list); 
} 

@Nullable 
@Override 
public void onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.some_layout, container, false); 
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); 
    recyclerView.setLayoutManager(getLinearLayoutManager()); 
    recyclerView.setAdapter(adapter); 
    return view; 
} 

(我從記憶會在這裏,但應該抓住它的要點)。

但是,如果我在新的線程調用中包裝列表/適配器初始化,有時在創建視圖時結果爲空,或者在某些情況下根據發生的情況拋出錯誤。

我只是有訂單錯誤或什麼?我應該在哪裏應用線程?

+0

只包裝someIntenseLoading線程中,並在它的結尾recyclerview.setAdapter(新的適配器(列表)) – X3Btel

+0

@ X3Btel你可以更明確,你是什麼意思?只是將它包裝在一個線程中並不能解決問題 – KaliMa

+0

當活動啓動時,最好在您的案例回收器視圖中初始化您的視圖,然後啓動您的asynctask /線程,並在其完成時更新視圖和結果 - 在您的案例中recyclerView.setAdapter – X3Btel

回答

0

可以使用的AsyncTask做背景的工作,然後在UI線程上執行代碼:

final List<SomeObject> list; 
     new AsyncTask<Void,Void,Void>(){ 
      @Override 
      protected Void doInBackground(Void... voids) { 
      list[0] = someIntenseDataLoadingProcess(); 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       recyclerView.setAdapter(new Adapter(list[0])); 
      } 
     }; 
+0

asynctask的問題是當你在屏幕中間旋轉屏幕時 – KaliMa

+0

@KaliMa http://stackoverflow.com/a/16305144/4810277或者不是那麼理想的變種來停止任務onPause並啓動它啓動它重新在onResume – X3Btel

0

難道我只是順序錯了或什麼?

你打電話從onCreate()方法someIntenseDataLoadingProcess(),這是一個不好的做法,因爲它阻止UI線程。在UI線程中運行的任何方法都應該儘可能少地工作。

裝載機是他們提供異步數據加載的方式。

看看Loaders guides

您可能會感興趣this回答有用。

相關問題