0

목록 항목을 탭하면 세부 섹션에서 새로 선택한 행과 관련된 데이터를로드하는 목록/세부 워크 플로를 구현하려고합니다. 이 작업을 수행하기 위해 AsyncTaskLoader을 사용하려고합니다. 3 개의 목록 항목을 한꺼번에 빠르게 탭하면로드 중 두 개만 실제로 발생하고 세 번째 항목은 길을 잃는 문제가 발생합니다.AsyncTaskLoader 세 번째 작업이 사라짐

이 동작을 보여주는 샘플 활동을 작성했습니다. 단추를 세 번 누르면 loadInBackground() 메서드가 두 번 호출됩니다. 어딘가에서 전화를 놓치고 있습니까?

public final class LoaderActivity extends Activity implements LoaderManager.LoaderCallbacks<Integer> { 

    private Button button; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.loader); 

     button = (Button) findViewById(R.id.load_button); 

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

    public void onButtonClick(View source) { 
     Loader<Integer> loader = getLoaderManager().getLoader(0); 
     if (loader != null) { 
      loader.forceLoad(); 
     } 
    } 

    @Override 
    public Loader<Integer> onCreateLoader(int id, Bundle args) { 
     return new IntLoader(this); 
    } 

    @Override 
    public void onLoadFinished(Loader<Integer> listLoader, Integer data) { 
     button.setText(String.valueOf(data)); 
    } 

    @Override 
    public void onLoaderReset(Loader<Integer> listLoader) { 

    } 

    private static final class IntLoader extends AsyncTaskLoader<Integer> { 

     private static final AtomicInteger counter = new AtomicInteger(0); 

     IntLoader(Context context) { 
      super(context); 
     } 

     @Override 
     public Integer loadInBackground() { 
      int result = counter.getAndIncrement(); 

      // Simulate a potentially expensive web call 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 

      } 

      return result; 
     } 

     @Override 
     protected void onStopLoading() { 
      cancelLoad(); 
     } 

     @Override 
     protected void onReset() { 
      onStopLoading(); 
     } 

     @Override 
     public void deliverResult(Integer data) { 
      if (isStarted()) { 
       super.deliverResult(data); 
      } 
     } 

    } 

} 
+0

메서드가 두 번만 호출되는 것이 확실합니까? 또는 메시지가 3 번 호출 될 수 있지만 'setText' 호출에 의해 UI가 업데이트되는 것은 2 번만 가능할 수 있습니다. 'onLoadFinished'는 기본적으로 UI 스레드와 동기화되지 않으므로 궁금합니다. –

+0

'loadInBackground()'가 두 번 호출되는 것만 확실합니다. - loadInBackground()의 시작 부분에 중단 점을 설정했습니다. –

+0

(사실 OK 'onLoadFinished'가 메인 UI 스레드에서 호출되는지에 대해 100 % 확신하지 못했습니다 ... CommonsWare와 Reto Meier가 모두 책의 반대편에 있기 때문에 혼란의 근원 인 것 같습니다.) . 나는 당신에게 돌아갈 것이다.) –

답변

0

는 호출 onButtonClick() 방법 restartLoader(0, null, this) 대신 getLoader(0)이 문제를 해결 한 것으로 보인다. 내가 Loader에 대해 더 많이 배우고 있기 때문에 그 시점에서 이전 결과를 무시하고 싶기 때문에 전화하는 것이 더 적절한 방법이라고 들립니다.

관련 문제