2012-06-06 3 views
0

이 메서드는 Activity가 아닌 RecordTable 클래스에 정의합니다.
주 UI 스레드에서 호출하고 유효한 UI 스레드 컨텍스트를 매개 변수로 전달합니다.
물론, 그것은 메시지와 함께 작동하지 않습니다 내가 다른 포스트에서 본
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()Android UI 스레드에없는 클래스에서 진행 대화 상자 표시

그들은 대신 new threadrunOnUiThread을 사용하는 것이 좋습니다하지만 클래스가 아니므로 활동 runOnUiThread 사용할 수 없습니다.

실행 가능 영역 밖에서 대화 상자를 시작하는 방법()도 작동하지 않습니다.

누구든지이 문제를 발견하고 해결 방법을 찾았습니까?

public synchronized void scrollUp(final Context context, final ArrayList<Record> list, final int count) { 
    new Thread(new Runnable() { 
     public void run() { 
      setScrolling(true); 
      ProgressDialog pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading_msg), true); 
      int n = Math.max(mViewStartIndex - count, 0); 
      for(int i = mViewStartIndex - 1; i >= n; i--) { 
       RecordTable.this.addFirstRow(list.get(i)); 
       RecordTable.this.removeViews(RecordTable.this.getChildCount() - 1, 1); 
      } 
      pd.dismiss(); 
      setScrolling(false); 
     } 
    }).start(); 
} 
+1

당신은 context.runOnUiThread (새로운 Runnable (etc ..))를 시도 했습니까? –

+0

@ MuratNafiz 방금 시도한 'runOnUiThread'는'context'에서 사용할 수 없습니다. – ilomambo

+0

당신의 컨텍스트를 자신의 Activity로 전송할 수 있습니다. 예 : ((YourActivityName) context) .runOnUiThread (new Runnable() ... 여기서 'YourActivityName'은 컨텍스트를 전달하는 작업입니다. –

답변

0
ProgressDialog pd; 
Context context; 

public synchronized void scrollUp(Context context, final ArrayList<Record> list, final int count) { 
this.context = context; 
new Thread(new Runnable() { 
public void run() { 
    setScrolling(true); 
    hand.sendEmptyMessage(0);     
    } 
    } 
}).start(); 

int n = Math.max(mViewStartIndex - count, 0); 
for(int i = mViewStartIndex - 1; i >= n; i--) { 
RecordTable.this.addFirstRow(list.get(i)); 
RecordTable.this.removeViews(RecordTable.this.getChildCount() - 1, 1); 

pd.dismiss(); 
setScrolling(false); 
} 


Handler hand = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
       pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading_msg), true); 
    } 
} 

+0

'runnable()'을 실행하는 주된 이유는 UI 스레드를 차단하지 않고 for 루프를 수행한다는 것입니다. 모든 코드를 실행 파일 외부에 넣으십시오. 또한 당신이 어떤 Activity 내부에서 돌아가고있는 경우 핸들이 유일한 해결책이라는 것을 확신한다. 나는 그렇지 않다. 이것은 RecordTable 클래스 내에서 실행 중이다 :::: 당신의 솔루션에서'pd.dismiss()'는 작동하지 않을 것이다. – ilomambo

2

나는 코드를 것입니다 감안할 때 ... 당신이 처리 할 클래스 처리기에서 어떤 대화 나 토스트를 만들려면이 .... 당신을 도움이 시도 AsyncTask을 사용하시기 바랍니다. AsyncTask에 대한 설명서를 살펴보십시오.

언제든지 UI 스레드에서 실행되는 progressUpdate으로 주기적으로 호출하여 doInBackground(....) 함수의 다른 스레드에서 원하는 작업을 수행하십시오. 구현하기가 훨씬 쉬우 며 새 스레드 생성에 대해 걱정할 필요가 없습니다. AsyncTask가 대신 해줍니다.

+0

나는 당신의 제안을 최후의 수단으로 남겨두고있다. 나는 그것이 효과적 일 것이라고 나는 확신한다, 나는 다른 것들을 위해 AsyncTask를 사용한다. : : :하지만 그것은 정말로 나를 아프게한다. 6을 실행할 새 클래스 만들기 코드 줄, 그냥 진도 대화 상자를 표시하기 때문에 ... :-( – ilomambo

+0

두 번째,이 특별한 경우에는 for 루프가 TableLayout을 조작하고 TableRows를 추가 및 삭제하기 때문에 AsyncTask를 사용할 수 없습니다. doInBackground()는 UI 요소를 처리 할 수 ​​없습니다. – ilomambo

+0

예 참으로 doInBackground는 UI 스레드에 대한 액세스 권한이 없지만 onProgressUpdate는 않습니다. 그래서 for 루프에서 테이블 레이아웃을 조작하고 싶다면 대신 progressUpdate를 호출하고 UI Thread에서 실행될 때 거기에서 조작을 수행하십시오. – Orlymee