35

Tôi đang cố gắng tìm ra cách sử dụng Loaders trong Android 3.0 nhưng dường như không làm cho nó hoạt động. Tài liệu chỉ mô tả bằng cách sử dụng CursorLoader nhưng tôi đang sử dụng AsyncTaskLoader.Máy bốc hàng trong Android Honeycomb

Từ tài liệu có vẻ như bạn chỉ cần triển khai AsyncTaskLoader.loadInBackground() nhưng không bao giờ được gọi sau getLoaderManager().initLoader() và sau đó tạo trình tải trong gọi lại.

Tôi có thể xem thông báo gỡ lỗi có nội dung là Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}} để có vẻ như nó được tạo thành công.

Có thể trình tải hiện đang bị hỏng trong SDK hoặc có phương pháp nào bạn cần gọi sau khi tạo trình tải không? (họ đã không làm điều đó trong ví dụ CursorLoader).

EDIT: Có vẻ như gọi forceLoad() trên Loader trở về từ initLoader() bắt đầu tải ít nhất nhưng điều này có nghĩa là bạn không thể xử lý một cách chính xác quay :(

+0

Nếu bạn tìm thấy câu trả lời cho điều này, vui lòng cho tôi biết. Tôi đã không thể tìm thấy bất cứ điều gì. –

+2

Ngoài ra còn có http://code.google.com/p/android/issues/detail?id=14944 đề cập đến cách giải quyết tương tự như nhận xét 'Chỉnh sửa'. –

+0

Vâng, đó là báo cáo lỗi của tôi về điều này :) – alexanderblom

Trả lời

13

Dianne Hackborn đã trả lời trình theo dõi lỗi và giới thiệu cho chúng tôi việc triển khai thư viện tĩnh. CursorLoader đang thực hiện forceLoad(), đó là lý do tại sao nó hoạt động.

Xem lớp kèm theo của tôi cho một lớp học mà xử lý việc này cho bạn trong hầu hết các trường hợp đơn giản ở các tracker lỗi: http://code.google.com/p/android/issues/detail?id=14944

+4

họ thực sự cần phải ghi lại CPL>. < – schwiz

+1

Điều đó thực sự rất tệ. Vì vậy, ví dụ được hiển thị ở đây: http://developer.android.com/reference/android/content/AsyncTaskLoader.html nếu bạn sử dụng Thư viện hỗ trợ sẽ không hoạt động trừ khi bạn ghi đè lên 'onStartLoading' – Blundell

+0

Vì vậy, bây giờ tôi có nguồn tham chiếu của riêng mình cho ASyncTaskLoader bằng cách sử dụng Thư viện hỗ trợ: http://blog.blundell-apps.com/tut-asynctask-loader-using-support-library/ – Blundell

0

Alex; Bạn hãy thử để xác nhận nếu onLoadInBackground() thậm chí còn được gọi là?

onLoadInBackground(): Được gọi trên chuỗi công nhân để thực hiện tải thực tế.Thực hiện không được cung cấp kết quả trực tiếp, nhưng phải trả lại kết quả từ phương pháp này, cuối cùng sẽ kết thúc cuộc gọi deliveryResult (D) chuỗi giao diện người dùng. Nếu triển khai cần xử lý các kết quả trên chuỗi giao diện người dùng, chúng có thể ghi đè lên deliverRes ult (D) và làm như vậy ở đó.

+1

Không, nó không được gọi trừ khi bạn thực hiện forceLoad(). – alexanderblom

1

Bạn cần phải ghi đè lên các phương pháp onStartLoading(). Xem ví dụ trên developer website.

/** 
    * Handles a request to start the Loader. 
    */ 
    @Override protected void onStartLoading() { 
     if (mApps != null) { 
      // If we currently have a result available, deliver it 
      // immediately. 
      deliverResult(mApps); 
     } 

     // Start watching for changes in the app data. 
     if (mPackageObserver == null) { 
      mPackageObserver = new PackageIntentReceiver(this); 
     } 

     // Has something interesting in the configuration changed since we 
     // last built the app list? 
     boolean configChange = mLastConfig.applyNewConfig(getContext().getResources()); 

     if (takeContentChanged() || mApps == null || configChange) { 
      // If the data has changed since the last time it was loaded 
      // or is not currently available, start a load. 
      forceLoad(); 
     } 
    } 
Các vấn đề liên quan