2013-02-20 5 views
0

내가 버튼을 클릭에 다음과 같은 서비스를 호출하고 서비스왜 서비스에서이 오류가 발생합니까?

E/ActivityManager(160): ANR in com.colo 
E/ActivityManager(160): Reason: Executing service com.colo/.services.PmService 
E/ActivityManager(160): Load: 8.41/7.12/6.4 
E/ActivityManager(160): CPU usage from 21836ms to -1ms ago: 
E/ActivityManager(160): 2.2% 160/system_server: 1.3% user + 0.9% kernel/faults: 9 minor 
E/ActivityManager(160): 1.9% 65/bma_wq: 0% user + 1.9% kernel 
E/ActivityManager(160): 1.4% 28646/com.colors.pipemedia: 1.2% user + 0.1% kernel/faults: 285 minor 1 major 
E/ActivityManager(160): 0.5% 27859/com.google.android.apps.maps:NetworkLocationService: 0.4% 
        user + 0% kernel/faults: 280 minor 14 major 
E/ActivityManager(160): 0.3% 18292/com.android.systemui: 0.3% user + 0% kernel/faults: 48 minor 
E/ActivityManager(160): 0% 61/synaptics_wq: 0% user + 0% kernel 
E/ActivityManager(160): 0.1% 144/adbd: 0% user + 0.1% kernel 
E/ActivityManager(160): 0.1% 246/com.android.phone: 0.1% user + 0% kernel/faults: 1 minor 
E/ActivityManager(160): 0% 62/check_ic_wq: 0% user + 0% kernel 
E/ActivityManager(160): 0% 72/kondemand/0: 0% user + 0% kernel 
E/ActivityManager(160): 0% 28602/logcat: 0% user + 0% kernel 
E/ActivityManager(160): 0% 5/events/0: 0% user + 0% kernel 
E/ActivityManager(160): 0% 58/file-storage: 0% user + 0% kernel 
E/ActivityManager(160): 0% 90/rild: 0% user + 0% kernel 
E/ActivityManager(160): 0% 237/com.hu1.wallpaper.forest: 0% user + 0% kernel/faults: 28 minor 
E/ActivityManager(160): 0% 1276/com.google.process.gapps: 0% user + 0% kernel 
E/ActivityManager(160): 0% 25919/flush-138:13: 0% user + 0% kernel 
E/ActivityManager(160): 0% 26459/AR6K Async: 0% user + 0% kernel 
E/ActivityManager(160): 0% 26461/ksdioirqd/mmc1: 0% user + 0% kernel 
E/ActivityManager(160): 0% 26467/wpa_supplicant: 0% user + 0% kernel 
E/ActivityManager(160): 0% 27702/com.wssyncmldm: 0% user + 0% kernel/faults: 9 inor 
E/ActivityManager(160): 0% 28103/com.android.vending: 0% user + 0% kernel/faults: 1 minor 
E/ActivityManager(160): 4.1% TOTAL: 2.8% user + 1.2% kernel 
E/ActivityManager(160): CPU usage from 1156ms to 1691ms later: 
E/ActivityManager(160): 43% 28646/com.colors.pipemedia: 31% user + 12% kernel/ults: 729 minor 2 major 
E/ActivityManager(160):  14% 28649/GC: 12% user + 1.7% kernel 
E/ActivityManager(160):  8.7% 28646/olors.pipemedia: 3.5% user + 5.2% kernel 
E/ActivityManager(160):  5.2% 28652/Compiler: 3.5% user + 1.7% kernel 
E/ActivityManager(160): +0% 28674/Thread-28: 0% user + 0% kernel 
E/ActivityManager(160): +0% 28675/[email protected]: 0% user + 0% kernel 
E/ActivityManager(160): 10% 160/system_server: 3.5% user + 7.1% kernel/faults: 4 minor 
E/ActivityManager(160):  10% 176/ActivityManager: 3.5% user + 7.1% kernel 
E/ActivityManager(160): 0.6% 22/kswapd0: 0% user + 0.6% kernel 
E/ActivityManager(160): 1.8% 65/bma_wq: 0% user + 1.8% kernel 
E/ActivityManager(160): 0.7% 72/kondemand/0: 0% user + 0.7% kernel 
E/ActivityManager(160): 0.8% 26461/ksdioirqd/mmc1: 0% user + 0.8% kernel 
E/ActivityManager(160): 1% 28602/logcat: 1% user + 0% kernel 
E/ActivityManager(160): 83% TOTAL: 35% user + 20% kernel + 26% iowait 
E/(160): Dumpstate > /data/log/dumpstate_app_anr 

부르고 때이 오류가 무엇입니까 이유. 버튼이 같은

final Intent pm_intent = new Intent(AccountsActivity.this , PmService.class); 
pm_intent.putExtra("Key", "gtalk service*****"); 
pm_intent.putExtra("user_name", acc.getAcc_Name()); 
pm_intent.putExtra("user_pass", acc.getAcc_Pass());    
Thread t = new Thread(){ 
public void run(){ 
    startService(pm_intent); 
    } 
}; 
t.start(); 

내가 중지하고 서비스

final Intent gtalk_intent = new Intent(getActivity() , GtalkService.class); 
Thread t = new Thread(){ 
    public void run(){ 
     getActivity().stopService(gtalk_intent); 
    } 
}; 
t.start(); 

답변

5

당신은 ANR을 받고있어, 그래서 당신은 당신의 UI 스레드에서 일부 프로세서 집약적 인 작업을하고있어 클릭합니다.

Service을 신품으로 출시했습니다. Thread입니다. 이 경우 Service이 새 Thread으로 시작하는 것처럼 보일 수 있지만 실제로는 그렇지 않습니다. 서비스의 내용을 새 스레드에서 실행하려면 onStartCommnand() 또는 onCreate()에 서비스 내에 새 스레드를 만들어야합니다. 그렇게 해봐.

+0

이렇게 스레드에서 장기 실행 함수를 호출 할 수 있습니까? 스레드 t = 새 스레드() { \t \t \t 공공 무효 실행() { \t \t \t \t setRosterNConnection(); \t \t \t} \t \t}}; \t \t t.start(); –

+0

스레드에서 코드를 실행할 수 있지만 코드가 서비스를 시작하면 서비스는 여전히 기본 UI 스레드에서 시작됩니다. –

+0

몇 주 동안 나는 왜 내 신청이 ANR로 계속되었는지 확신 할 수 없었기 때문에 나는 이것을 표결했다. 새 스레드를 시작하고 그 안에 context.service를 호출하면 새 스레드를 생성하지 않고 기본 UI 스레드에서 호출된다는 것이 확실하지 않습니다. 이 게시물을 읽은 후 onStartCommand 내에서 내 서비스 내에서 새 스레드를 호출하고 내 문제를 해결 한 것처럼 보일 것 같습니다. 정말 고맙습니다! 당신과 모든 참여자에게! – JenniferG