로더가 여러 개인 LoaderManager : 올바른 커서 로더를 얻는 방법


116

나에게 로더가 여러 개인 경우 올바른 커서를 얻는 방법이 명확하지 않습니다. 다음을 사용하여 두 개의 다른 로더를 정의한다고 가정 해 보겠습니다.

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

그런 다음 onCreateLoader () 에서 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;
} 

여태까지는 그런대로 잘됐다. 그러나 올바른 Cursoradapter에 대한 올바른 커서를 식별하는 ID를 얻지 못하기 때문에 onLoadFinished () 에서 올바른 커서를 얻는 방법 .

@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

또는 내가 틀렸고 이것은 하나의 조각에서 두 개의 다른 커서 어댑터에 대한 결과를 얻는 잘못된 방법입니다.


이것은 정말 좋은 질문입니다! 잘 묻고 상당히 미묘한 주제를 다룹니다. 매우 구체적입니다.
Kurtis Nusbaum 2011 년

7
당신이 언급되어야 로더 반환 형식이 있기 때문에, 제네릭 형식의 삭제로 인해 모든 로더에 걸쳐 동일하지 않습니다 때마다, 자바는 (인터페이스를 구현하는 것을 허용하지 않습니다 별도의 핸들러 클래스를 사용하는 LoaderCallbacks것보다 더으로이 경우에는) 유형. 두 경우 모두 결과가 Cursor.
Matthias

1
@Matthias 당신이 그것을 언급했습니다! 반환 유형이 다른 2 개의 로더를 사용하는 방법을 고려 중입니다. 2 개의 다른 반환 유형을 가진 2 개의 로더가 있다면 어떨까요? 하나의 로더로 한 작업을 수행하고 대신 스레드로 다른 작업을 수행합니까?
Robert

@Robert 스레드를 사용할 필요가 없습니다. 두 개의 Loaders를 사용할 수 있습니다 . 이 stackoverflow.com/a/20839825/2818583
AnV

답변:


119

Loader 클래스에는 getId () 라는 메서드가 있습니다. 로더와 관련된 ID가 반환되기를 바랍니다.


고마워, 커티스! 멋있는! 나는 그것을 시도하지만 그것이 작동 할 것으로 기대합니다. 나는 같은 생각을 가지고 있지만 로더 객체를 보지 않았습니다. 대신 커서 개체를 살펴 보았습니다 ...
Kay Gladen

Loader.getID ()와 함께 작동합니다! 나는 이것을 지금 다시 확인했다. 큰!
Kay Gladen 2011 년

2
내부 / 익명 클래스를 사용하여이 작업을 수행 할 생각이므로 각 로더에는 콜백을받는 자체 개체가 있습니다.
Jords

@KurtisNusbaum, 왜 그것이 틀렸을까요? 내부 클래스는 외부 활동과 함께 파괴되므로 메모리 누수 또는 그 어떤 것도 발생하지 않아야합니다. 활동에 대한 강력한 참조가있는 정적 클래스는 의미 상 내부 클래스와 동일합니다 (외부 클래스에 대한 암시 적 강력한 참조를 유지합니다.)
Matthias

6
@Jords 기술적으로 정확합니다. 나는 그것에 대해 토론하지 않습니다. 하지만 전화 만 할 수 있는데 왜 그 모든 리가 마롤을 getId()할까요?
Kurtis Nusbaum

32

로더 의 getId () 메소드를 사용하십시오 .

@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

로더에 결과의 클래스 유형 외에 공통점이없는 경우 (여기 Cursor:), 두 개의 개별 LoaderCallbacks인스턴스 (활동 / 조각에서 두 개의 내부 클래스)를 만드는 것이 좋습니다. 각 인스턴스는 하나의 로더 처리 전용입니다. 사과와 오렌지를 섞는 것보다.

귀하의 경우에는 데이터 소스와 결과 처리가 모두 다른 것으로 보이므로 현재 시나리오를 식별하고 적절한 코드 블록으로 전달하기 위해 추가 상용구 코드를 작성해야합니다.


질문이 하나 있습니다. 목적의 Activity구현 LoaderCallbacks및 전달 this하려면 getLoaderManager().initLoader()그 보장하는 LoaderManager사이의 통신 채널의 역할 ActivityLoader비아 LoaderCallbacks. Activity구현 LoaderCallbacks되지 않고 익명의 내부 클래스를 생성하기 때문에 통신 채널이 어떻게 생성 됩니까?
AnV

3
통신 채널은 LoaderCallbacks. 아무것도 사용할 필요 Activity로 자신을 LoaderCallbacks. 필요할 때 여러 통신 채널을 만드는 것이 더 간단합니다.
BladeCoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.