2012-08-03 2 views
-1

나는 과 함께 Service을 가지고 있습니다. 내 ContentObserver이 변경 사항을 감지하면 서비스의 boolean 변수를 true로 설정합니다. 나는 또한 Thread 서비스에서 실행하고 잠시 잠들고 그 변수를 확인하기 위해 깨운다.서비스 내 스레드에서 ProgressDialog 표시

변경을 감지하면 다른 코드를 처리하는 데 약간의 시간이 필요하며 지연 중에 ProgressDialog을 표시해야합니다. 어떻게해야합니까?

답변

2

대신 AsyncTask을 사용해야합니다.

Here은 라이브러리에 대한 링크입니다.

1) onPreExecute() = 보여

2 ProgressDialog) doInBackground() = 코드 실행

3) onPostExecute() = ProgressDialog

은 AsyncTask를이

+0

하지만 OP는 서비스에서이 작업을 수행하려고 했으므로 AsyncTask에서도 ProgressDialog를 실행할 적절한 컨텍스트가 없습니다. –

1

:-) DONE 기각 : 매우 간단하다 좋은 대안이지만 여전히 스레드로 진행하기로 결정한 경우 UI의 ProgressDialog를 표시하려면에 전화해야합니다. 활동의방법.

당신이 이런 식으로 뭔가가 있어야 서비스에서 스레드 안에는 MainActivity.으로해서 ProgressDialog를 표시한다고 가정하자 :

MainActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // Display ProgressDialog here 
    } 
}); 
+0

하지만 OP가 서비스에서이 작업을하려고 했으므로 MainActivity.this가 작동하지 않습니다. 맞습니까? –

2

질문의 본질은 당신이 당신의 서비스의 메시지를 보낼 것입니다 어떤 종류의 UI (로드 대화 상자를 표시).

이것에 대해가는 네 가지 (또는 그 이상)의 가지가 있습니다

  • 텐트는 : 서비스는 (싱글)을 서비스 개체 자체를 사용하여 사용자의 작업에
  • AIDL
  • 을 의도를 보낼 수있다
  • 활동이

이 옵션은 잘 알고있는 것처럼 보일 수 있습니다 방송 수신기 수 갖는,584,132 10

이러한 옵션을 읽고 선택해야합니다.

1

답변 해 주셔서 감사합니다. 내 변수가 을 변경할 때 방송 의도 - - 내가 다음 단계를 사용하여 문제를 해결 내가 아는

0

이 오래된 스레드 내 활동 runOnUiThread 전화 onReceive 브로드 캐스트 리시버의 방법 안에 - (활동의) 의도에 대한 을 브로드 캐스트 리시버를 만들 하지만 방금 여기 스레드에서 구현했기 때문에 필요한 항목을 정확하게 가지고 있습니다.에서는 ProgressBar에 대해 이야기 페이지 아래 더 Rachit 슈라의 답변을 읽어 보시기 바랍니다 :

내 서비스이이 Communication between Activity and Service

: 표시하거나 기각하는

public void sendMessage(int state) { 
    Message message = Message.obtain(); 
    switch (state) { 
     case 1://SHOW: 
      message.arg1 = 1; 
      break; 
     case 0: 
      message.arg1 = 0; 
      break; 
    } 
    try { 
     messageHandler.send(message); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 

통화 sendMessage 첨부 (1) 또는 0 서비스 내의 ProgressDialog.

그리고 이것은 내 주요 활동에 다음해서 ProgressDialog는 서비스에서 표시 할 수 없습니다

private ProgressDialog progress; 

public class MessageHandler extends Handler { 
    @Override 
    public void handleMessage(Message message) { 
     int state = message.arg1; 
     switch (state) { 
      case 0://HIDE 
       progress.dismiss(); 
       break; 
      case 1://SHOW 
       progress = ProgressDialog.show(MainActivity.this, (getResources().getString(R.string.CONNECTING) + "..."), (getResources().getString(R.string.PLEASE_WAIT) + "!")); //show a progress dialog 
       break; 
     } 
    } 
} 

, 그것은 활동이나 조각에서 호출해야합니다. 필요한 모든 코드를 추가하고 필요에 따라 잘 작동하기를 바랍니다. 솔직하게 말해서 나는 메시지 처리기가 어떻게 작동하는지 모르지만 그것은 나를 위해 일한다! 명명은 아마도 lol 중 가장 좋지 않습니다. 죄송합니다.