2012-06-25 2 views
0

RPC 메커니즘을 사용하여 서버간에 정보를 설정/가져 오는 Android 앱이 있습니다. 내가 메인 스레드 (차단) whithin에서 RPC를 호출하고 나는 그들을 차단하고 싶습니다. 그러나 때로는 몇 초 동안 통화가 지속될 수 있으며 지정된 시간 (예 : 1 초) 후에 불확정 진행 대화 상자를 표시하려고합니다.Android : 진행중인 대화 차단 RPC

전화를 걸고 주 스레드가 호출이 완료 될 때까지 루프 (절전 모드)로 대기하는 새 스레드를 생성하려고했습니다. 이 루프 내에서는 진행 대화 상자를 표시하지만 작동하지 않습니다.

다른 스레드의 진행 대화 상자를 표시하고 업데이트 할 수 있습니까? 아니면 더 나은 솔루션을 알고있어 차단 호출을 사용할 수 있습니까?

답변

0

AsyncTask을 사용해보세요. 그것은 그러한 네트워크 호출을하는 데 사용되는 안드로이드 메커니즘입니다. 짧은 여기 AsyncTask의 선발 받기 :

Using AsynTask to show progress bar while attempting to SSH to Server

AsyncTask 당신이 앞서 진행에서 사용자를 차단할 수 있습니다 사용. onPreExecute() 방법에서 progress dialogAsyncTask으로 표시해야합니다. 모든 네트워크 관련 활동은 doInBackground()에서 진행됩니다. 백그라운드 작업이 완료되면 onPostExecute()으로 전화가 걸려 progress dialog가 해지됩니다.

AsyncTask은 동시에 2 개의 스레드가 작동하기 때문에 비동기 호출이며, 하나는 진행 대화 상자를 표시하는 UI 스레드이고 다른 하나는 서버에서 데이터를 가져 오는 비 UI 스레드입니다.

이 설명이 도움이 되길 바랍니다.

0

두 가지를 모두 수행 할 수 없으므로 기본 스레드가 루프에서 대기하고 동시에 진행률 대화 상자가 표시됩니다. 주 스레드가 대기하거나 대화 상자를 표시합니다.

왜 주 스레드를 차단 하시겠습니까? 인터넷을 통한 통신은 백그라운드 스레드에서 수행되어야합니다. 왜냐하면 완료하는 데 얼마나 오래 걸릴지 모르기 때문입니다. 그 내용을 AsyncTask으로하고 메인에 진행률 대화 상자를 표시하십시오.

+0

(사용자가 기다려야 :

는 새 스레드에서 UI를 업데이트하려면 진행), 비동기 방식은 프로그램 로직을 훨씬 더 복잡하게 만든다. – osiris81

+0

복잡하지 않습니다. 대부분의 앱이 네트워크를 사용함에 따라 요즘에는 거의 모든 앱의 일부입니다. 백그라운드에서 AsyncTask의 데이터를 가져 오는 동안 사용자가 진행 대화 상자를 기다리게하십시오. – Ronnie

0

나는 작동하는 것처럼 보이는 해결책을 발견했습니다. (적어도 나는 아직 어떤 문제도 발견하지 못했습니다.) AsyncTask처럼 somethn을 사용하는 것이 적절한 방법이라는 것을 알고 있지만 제 경우에는 아무런 이점도 없으므로 프로그램 논리가 복잡합니다. 그가 할 수있는 전에 어쨌든

나는 호출이 비동기 할 경우 내 응용 프로그램에 더 이익이 없기 때문에 메인 스레드를 차단하려는
new Thread() 
    { 
     public void run() 
     { 
      Looper.prepare(); 
      ... do UI stuff here 
      Looper.loop(); 
     } 
    }.start(); 
관련 문제