16

Khi xác định Trình tải trong Trình quản lý tải của bạn, bạn sử dụng các id duy nhất. Tôi hỏi về những id duy nhất đó.Phạm vi của Trình quản lý tải là gì?

Mọi hoạt động và đoạn có Trình quản lý tải riêng không? Các đoạn có sử dụng Trình quản lý tải của Hoạt động mà chúng được đính kèm không? Chỉ có một LoaderManager mà ứng dụng sở hữu?

Điểm thưởng nếu bạn có thể cho tôi biết cách có thể thay đổi Trình quản lý tải mà bạn đang sử dụng. Nếu tôi muốn mọi mảnh trong Hoạt động của tôi sử dụng cùng một LoaderManager (một số trong số chúng đang kéo cùng một dữ liệu và chia sẻ các Trình tải sẽ tốt đẹp), điều đó có thể xảy ra không?

+3

[** Hiểu về Trình quản lý tải (phần 2) **] (http://www.androiddesignpatterns.com/2012/05/why-you-should-use-loadermanager.html) –

Trả lời

8

Tôi hiện đang chuyển ứng dụng của mình sang gói tương thích với Android (chủ yếu cho CursorLoader and Fragments). Tôi hiện đang cố gắng chia sẻ một CursorLoader giữa hai đoạn để dành một truy vấn cho ContentProvider của tôi. Chào mừng đến với thế giới của tôi! ;)

Một trường hợp sử dụng đơn giản:.

- DummyActivity kéo dài FragmentActivity/Log.d (Constants.LOGTAG, "DummyActivity.onCreate" + getSupportLoaderManager() toString());

- DataFragment mở rộng các cài đặt Fragment LoaderManager.LoaderCallbacks/Log.d (Constants.LOGTAG, "DataFragment.onCreate" + getLoaderManager(). ToString());

- Báo cáoPhân tích mở rộng Hoạt động phân mảnh LoaderManager.LoaderCallbacks/Log.d (Constants.LOGTAG, "ReportFragment.onCreate" + getLoaderManager(). ToString());

DummyActivity instanciates DataFragment và sau đó instanciates ReportFragment. Đầu ra logcat hiển thị các địa chỉ differents cho mỗi LoaderManager. Như một kết luận đầu tiên, mỗi Fragment dường như có một LoaderManager phù hợp…

Tôi sẽ tiếp tục và cập nhật nếu tôi có thể trả lời câu hỏi (của chúng tôi)). Nếu bạn đã thực hiện bất kỳ tiến bộ nào, vui lòng chia sẻ kiến ​​thức có giá trị của bạn.

Cập nhật:

giả định của tôi là rằng id nạp chỉ được kết hợp với một phạm vi địa phương của một LoaderManager cho một đoạn cụ thể để cho phép nhiều bộ tải địa phương có liên quan đến phần phân đoạn (để bạn có thể trả về một bộ nạp khác nhau trong onCreateLoader dựa trên id int arg và các lời gọi initLoader).

Cho đến nay tôi quản lý để "tái sử dụng" một Loader (... hay không):

- Trước tiên, tôi đã kích hoạt LoaderManager gỡ lỗi với getSupportLoaderManager().enableDebugLogging(true); trong phương pháp DummyActivity onCreate.

- Sau đó, tôi đã gọi getActivity().getSupportLoaderManager().initLoader(78, null, this); từ các phương pháp onCreate của cả DataFragment và ReportFragment.

- DataFragment hiển thị CursorLoader được tạo bởi phương thức onCreateLoader thông qua trình thiết lập trên thành viên riêng tư mCursorLoader.

- Báo cáoFragment onCreateLoader trả về Trình nạp con trỏ DataFragment (sau khi truy xuất Phân đoạn bằng findFragmentByTag).

Các lọc (và hơi obfuscated) đầu ra logcat:

 DummyApp D DummyActivity.onCreate 
     DummyApp D DataFragment.newInstance 
     DummyApp D ReportFragment.newInstance 
     DummyApp D DataFragment.onCreate 
LoaderManager V initLoader in LoaderManager{405a19d0 in SpecificAction{4059ee98}}: args=null 
     DummyApp D DataFragment.onCreateLoader 
LoaderManager V Created new loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}} 
     DummyApp D DataFragment.onCreate 
     DummyApp D DataFragment.onActivityCreated 
     DummyApp D ReportFragment.onCreate 
LoaderManager V initLoader in LoaderManager{405a19d0 in DummyActivity{4059ee98}}: args=null 
LoaderManager V Re-using existing loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}} 
     DummyApp D SpecificActionReportFragment.onCreate 
     DummyApp D SpecificActionReportFragment.onActivityCreated 
LoaderManager V Starting in LoaderManager{405a19d0 in DummyActivity{4059ee98}} 
LoaderManager V Starting: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}} 
DummyProvider D query called 
DummyProvider D […]  
DummyProvider D [end of query] 
LoaderManager V onLoadComplete: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}} 
LoaderManager V onLoadFinished in CursorLoader{405a22e0 id=78}: CursorWrapperInner{405afb20} 
     DummyApp D ReportFragment.onLoadFinished 
     DummyApp D ReportFragment.displayActionReport 
     DummyApp D DummyActivity.setReportViewsVisibility 
     DummyApp D ReportFragment.setSaveReportImageViewVisibility 

Hai mảnh vỡ được thêm vào từ phương pháp DummyActivity onCreate (khác với trường hợp sử dụng mô tả, nhưng điều đó có gì thay đổi đến vấn đề chúng tôi đang làm việc trên). Thật không may, bộ nạp được gán lại cho đoạn mới nhất gọi nó (ở đây là ReportFragment) ... và DataFragment.onLoadFinished không bao giờ được gọi. Kết quả là, ReportFragment có vẻ tốt nhưng DataFragment không được cập nhật vì bản cập nhật được gọi từ lớp onLoadFinished của lớp này.

Tôi giả định rằng có cuộc gọi không đăng ký cơ bản sau đó là cuộc gọi đăng ký trên CursorLoader.

Để được tiếp tục…

+0

Cảm ơn bạn đã trả lời! Tôi đã làm một số công cụ iOS, nhưng nên có thời gian để chơi xung quanh và kết thúc trả lời câu hỏi này trong một tuần hoặc lâu hơn. Sẽ báo cáo lại! :) – num1

+0

Tôi cũng sẽ làm việc trong những ngày tiếp theo vì bạn của tôi đang chờ đợi. – Renaud

+0

Tôi cuối cùng sẽ tối ưu hóa ContentProvider của mình. Xin lỗi vì không xứng đáng với điểm thưởng…;) – Renaud

0

Có. Nó làm việc cho tôi. Tôi có 3 mảnh vỡ khác nhau trong Ngăn điều hướng nơi cùng một dữ liệu được điền trong các ListView khác nhau. (Tất cả các Phân đoạn là một phần của Hoạt động CÙNG).

AsyncTaskLoader của tôi:

public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> { 

public MyTaskLoader(Context context) { 
    super(context); 
} 

@Override 
public HashMap<String, Integer> loadInBackground() { 
... 
return hashMap; 
} 

... 
} 

Sử dụng Id Loader Cùng trong tất cả các mảnh vỡ.

Fragment1:

public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 

//initialize adapter 

getActivity().getSupportLoaderManager().initLoader(0, null, this); 

} 

@Override 
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) { 
    // TODO Auto-generated method stub 

    return new MyTaskLoader(getActivity()); 
} 

@Override 
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0, 
     HashMap<String, Integer> data) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(data.keySet()); 

} 

@Override 
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(null); 
} 
} 

Sử dụng cùng một ID cho Fragment2:

public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 

//initialize adapter 

getActivity().getSupportLoaderManager().initLoader(0, null, this); 

} 

@Override 
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) { 
    // TODO Auto-generated method stub 

    return new MyTaskLoader(getActivity()); 
} 

@Override 
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0, 
     HashMap<String, Integer> data) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(data.keySet()); 

} 

@Override 
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(null); 
} 
} 

Các bộ chuyển đổi nên được khởi tạo trước khi khởi tạo bộ nạp. Hoạt động cho đến nay. Nhưng, đây có phải là cách đúng đắn không? Có phương pháp nào tốt hơn để sử dụng bộ tải chung cho nhiều Phân đoạn không?

Các vấn đề liên quan