2016-06-13 2 views
-1

전에 루프 실행 '에 대한'내부 나는 루프이 중첩 있습니다안드로이드 - 외부 루프

for(int i = 0; shouldContinue && i < in.size(); i++){ 
    final int l = i; 

    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      sb.setSpan(fcs, 0, l, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
      tv.setText(sb); 
     } 
    }); 

    for(int j = 0; shouldContinue && j < in.get(i).length(); j++){ 
     //some code 
    } 
} 

이 코드와 관련된 두 개의 스레드가 있습니다. for (루프)가 작동하는 기본 (UI) 스레드 및 백그라운드 스레드. 문제는 내부 루프가 바깥 루프의 tv.setText (sb) 전에 코드를 실행하고 있으며 다른 방법으로이 작업을 수행해야한다는 것입니다. 나는 이것이 두 개의 개별 스레드라는 사실과 관련이 있다고 생각하지만, 내부 루프에 들어가기 전에 runOnUIThread 코드를 작동시키는 방법을 모르겠다.

도움을 주시면 감사하겠습니다.

+1

은'tv.setText (SB),'문은 루프의 외부를 _in_되지 않습니다. 그것은 선언을 outer for 루프에 의해 어휘 적으로 둘러싸는 다른 클래스의'run()'메소드에 있습니다. 루프의 일부로 실행되지 않습니다. 루프를 사용할 때마다 익명의 내부 클래스의 새로운 인스턴스가 생성되어'runOnUiThread (...)'에 제출됩니다. 'run()'메소드는 UI 스레드에 의해 _later_라고 불릴 것이다. 나중에 얼마나? 죄송합니다. 안드로이드에 대해 잘 모르겠습니다. –

답변

1

당신이 이것을 달성하기 위해 CountDownLatch를 사용할 수 있습니다

for(int i = 0; shouldContinue && i < in.size(); i++){ 
    ... 
    CountDownLatch latch = new CountDownLatch(1); 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
       sb.setSpan(fcs, 0, l, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
       tv.setText(sb); 
       latch.countDown(); 
     } 
    }); 

    latch.await(); 
    for(int j = 0; shouldContinue && j < in.get(i).length(); j++){ 
     //some code 
    } 
} 
+0

지금 실행 중입니다. 고맙습니다. – DD225