Trình tải trình quản lý với nhiều trình tải: làm thế nào để có được trình tải con trỏ đúng


116

Đối với tôi không rõ làm thế nào để có được con trỏ đúng nếu bạn có nhiều Trình tải. Hãy nói rằng bạn xác định hai Trình tải khác nhau với:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);

sau đó trong onCreateLoader () bạn làm những việc khác nhau tùy thuộc vào id:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

càng xa càng tốt. Nhưng làm thế nào để có được con trỏ đúng trong onLoadFinished () bởi vì bạn không nhận được bất kỳ id nào để xác định đúng Con trỏ cho đúng Coderad CHƯƠNG.

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

hoặc tôi sai và đây là cách sai để lấy kết quả cho hai con trỏ khác nhau trong một đoạn.


Đây thực sự là một câu hỏi tốt! Nó cũng được hỏi và chạm vào một chủ đề khá sắc thái. Vô cùng đặc biệt.
Kurtis Nusbaum

7
Cần phải đề cập rằng bạn phải sử dụng các lớp trình xử lý riêng biệt bất cứ khi nào kiểu trả về của trình tải không giống nhau trên tất cả các trình tải, do do xóa kiểu chung, Java không cho phép bạn thực hiện một giao diện ( LoaderCallbackstrong trường hợp này) với nhiều hơn một kiểu. Nó chỉ hoạt động trong trường hợp của bạn vì cả hai lần, kết quả là một Cursor.
Matthias

1
@Matthias Tuyệt vời bạn đã đề cập đến nó! Tôi chỉ đang xem xét làm thế nào để có 2 bộ tải với loại trả lại khác nhau. Vậy nếu 2 bộ tải với 2 loại trả khác nhau thì sao? Thay thế một tác vụ với 1 trình tải, một tác vụ khác với luồng?
Robert

@Robert Không cần sử dụng chủ đề. Bạn có thể sử dụng hai Loaders. Vui lòng đi qua stackoverflow.com/a/20839825/2818583
AnV

Câu trả lời:


119

Lớp Loader có một phương thức gọi là getId () . Tôi hy vọng điều này trả về id bạn đã liên kết với trình tải.


Cảm ơn, Kurtis! Mát mẻ! Tôi sẽ thử nó nhưng hy vọng rằng nó sẽ hoạt động. Tôi đã có cùng một ý tưởng nhưng không nhìn vào đối tượng loader. Thay vào đó, bạn đã nhìn vào đối tượng con trỏ ...
Kay Gladen

Nó hoạt động với Loader.getID ()! Tôi đã nhân đôi điều này ngay bây giờ. Tuyệt quá!
Kay Gladen

2
Tôi đang nghĩ đến việc thực hiện điều này bằng cách sử dụng các lớp bên trong / ẩn danh, để mỗi trình tải có đối tượng riêng của nó nhận được các cuộc gọi lại.
Jords

@KurtisNusbaum, tại sao điều đó không chính xác? Lớp bên trong sẽ bị phá hủy cùng với Hoạt động bên ngoài, vì vậy điều này không dẫn đến rò rỉ bộ nhớ hoặc bất cứ điều gì. Một lớp tĩnh có tham chiếu mạnh đến Hoạt động tương đương về mặt ngữ nghĩa với một lớp bên trong (giữ một tham chiếu mạnh mẽ tiềm ẩn cho lớp bên ngoài.)
Matthias

6
@Jords Đó là kỹ thuật chính xác. Tôi không tranh luận về điều đó. Nhưng tại sao tất cả các Rigamarole khi bạn chỉ có thể gọi getId()?
Kurtis Nusbaum

32

Sử dụng phương thức getId () của Trình tải:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

Nếu các trình tải của bạn không có gì chung ngoài loại kết quả (ở đây Cursor:), thì tốt hơn hết bạn nên tạo hai LoaderCallbackstrường hợp riêng biệt (đơn giản là hai lớp bên trong trong Hoạt động / Đoạn của bạn), mỗi lớp dành riêng cho một điều trị trình tải, thay vào đó hơn là cố gắng trộn táo với cam.

Trong trường hợp của bạn, dường như cả nguồn dữ liệu và cách xử lý kết quả đều khác nhau, điều này đòi hỏi bạn phải viết mã soạn sẵn bổ sung để xác định kịch bản hiện tại và gửi nó đến khối mã thích hợp.


Tôi có một câu hỏi. Mục đích của Activityviệc thực hiện LoaderCallbacksvà chuyển thisđến getLoaderManager().initLoader()là để đảm bảo rằng LoaderManagerhoạt động như kênh liên lạc giữa ActivityLoaderthông qua LoaderCallbacks. Làm thế nào mà kênh truyền thông được tạo ra ở đây Activitykhông phải là triển khai LoaderCallbacksmà là tạo các lớp bên trong ẩn danh?
AnV

3
Các kênh truyền thông là LoaderCallbacks. Không có gì đòi hỏi phải sử dụng Activitychính nó như LoaderCallbacks. Thật đơn giản để tạo nhiều kênh liên lạc khi bạn cần chúng.
BladeCoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.