2011-03-14 4 views
4

현재 핸들러를 사용하여 백그라운드에서 실행되도록 처리기를 호출하고 있습니다. 문제는 응답을하기 위해 시간이 더 많이 걸리는 것입니다. 성능 측면에서 보면 비용이 더 많이 드는 것 같습니다. 이제 비동기 호출을 수행 할 계획입니다. 가장 좋은 비동기 호출은 무엇입니까? Android에서 처리기와 비동기 호출의 차이점은 무엇입니까? 최선의 해결책을 찾도록 도와주세요. 인터페이스는 메서드를 호출하기 전에 몇 분 동안 교수형처럼 내가이 메서드를 호출하고 로그인 버튼을 클릭하면 참고로처리기 대 안드로이드의 비동기 호출

여기

signIn.setBackgroundResource(R.drawable.signin_press); 
changeImage=new Runnable(){ 
    public void run(){         
      signIn(); 
     } 
    };  
signinHandler.post(changeImage); 

일부 코드 조각을 제공하고, 그것은 보인다. 이 방법에서는 사용자를 인증하고 등록하기 위해 두 가지 비싼 웹 서비스 호출이 필요합니다. 앱의 속도 저하를 정상화하려면 어떻게해야합니까? 도와주세요.

답변

3

그것이 정말 사용량에 따라 달라 detriments 대 그 혜택의 프로파일 가능성이 당신에게 내려 올 것이다 AsyncTask를 사용하여 각각 ThreadHandler를 사용하는 특정 장점이 있습니다.

Android에서의 스레딩에 대한 이해를 돕기 위해 Painless Threading 문서를 권하고 싶습니다.

EDIT 자세한 내용은.

우리가 연결된 Painless Threading 문서의 코드를 변경하면 이와 비슷한 결과를 얻을 수 있습니다. 당신이 실행을 계속하거나 통지 할 필요가있는 TODO에서

new Thread(new Runnable() { 
    public void run() { 
     signIn(); 
     signinHandler.post(new Runnable() { 
     public void run() { 
      //TODO: Something to notify of login complete/continue processing. 
     } 
     }); 
    } 
    }).start(); 

, 나는 그게 리팩토링되어야 할 것이다 UI 스레드가 교차 그렇다면 현재 signIn() 처리됩니다 모르겠어요.

+0

"이점이 무엇입니까?" AsyncTask는 스레드와 핸들러를 내부적으로 사용합니다. –

+0

@ Yoni Samlan "AsyncTask"가 특정 작업에 너무 귀찮은 것처럼 보이고 Runnable이 관리하기 쉽고 다른 시나리오에서도 마찬가지 일 수있는 주요 이점이 제어 및 유용성/관리 효율성이라고 생각합니다. 나는 하나를 사용하면 실행 속도가 상당히 느려지거나 빨라지는 것을 의미하지는 않습니다. –

+0

응답 해 주셔서 감사합니다. 내 문제에 대해 알기 위해 참조 용 코드 스 니펫으로 게시물을 편집했습니다. – Rajapandian

2

AsyncTask는 내부적으로 스레드 풀과 처리기를 사용합니다. 그것은 마법이 아닙니다. see the source. 성능은 자신의 핸들러보다 더 낫지는 않을 것입니다 (스레드 풀을 사용하면 새 스레드를 작성하는 데 약간의 오버 헤드가 절약 될 수 있지만 일반적인 웹 서비스 호출의 지속 시간과 비교하면 무시할만큼 작습니다. 몇 밀리 초는 사용자가 눈에 띄는 영향을주지 않을 것입니다.) 웹 요청을하는 데 필요한 요소가 많으면 네트워크 연결, 서버 트래픽 등과 달리 스레드/처리기가 앱 속도를 늦추는 이유는 무엇입니까? 어설 션을 다시 코드화합니까?

+0

+1. 다른 종류의 스레드에 작업을 두는 것은 전혀 상관이 없습니다. 두 경우 모두 (executeOnExecutor를 사용하지 않는 한) 작업은 순서대로 한 번에 하나씩 실행됩니다. –

+0

좋은 점, 현대 AsyncTasks에 대해 추가 할만한 가치가 있습니다. 단, 3.1 이상을 타겟팅하는 경우에만 해당됩니다. 3.0 이하, 또는 3.1 + 더 낮은 대상 SDK (2 년 전이 답변을 썼을 때 표준!)를 사용하는 응용 프로그램은 기본적으로 병렬 실행 (스레드 풀의 크기까지)을 사용합니다. 문서를 참조하십시오. http://developer.android.com/reference/android/os/AsyncTask.html –