2015-07-31 6 views
14

Mam dziwny problem, który ostatnio wystąpił. Wywołuję usługę o nazwie NotificationService, która rozszerza klasę IntentService. Teraz w metodzie onHandleIntent (Intent intent) wykonuję wywołanie zadania asynchronicznego. Kod jest podany poniżej:Klasa IntentService nie działa AsyncTask na głównym wątku interfejsu użytkownika. Wykonanie metody musi zostać wywołane z głównego wątku, aktualnie wnioskowany wątek to pracownik

@Override 
protected void onHandleIntent(Intent intent) { 
    defPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
    //int fiveMinutes = 1000 * 60 * 5; 
    //Setting an alarm to call AlarmScheduler service now. This alarm scheduler service will set next days alarm to show notifications 
    //based on the weekly schedule as obtained from server. 
    Intent i = new Intent(NotificationService.this, ScheduleAlarms.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    //i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getService(NotificationService.this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) NotificationService.this.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC, Calendar.getInstance().getTimeInMillis(), pendingIntent);//Use AlarmManager.INTERVAL_DAY instead of int number here. 

    //Check if locally notifications are enabled by the user then only show notification depending on 
    //if there are any latest notifications to be shown. 
    if(defPrefs.getBoolean(getString(R.string.notifications),true)) { 
     NotificationAsyncTask httpAsyncTask1 = new NotificationAsyncTask(); 
     httpAsyncTask1.mOnHttpResponseListener = new GetHomeResponse(intent); 
     httpAsyncTask1.execute("http://" + HttpAsyncTask.IP_ADDRESS + "/v5/getResult"); 
    }else{ 
     Log.v("NotificationService","Disabled"); 
    } 

} 

Gdzie NotificationAsyncTask jest prywatną klasą zdefiniowaną w tej usłudze. Teraz otrzymuję błąd Metoda execute musi zostać wywołana z głównego wątku, aktualnie wnioskowany wątek jest pracujący. Nie rozumiem, jak ta metoda wykonywania nie działa w głównym wątku? Proszę pomóż.

Odpowiedz

22

Teraz wewnątrz metody onHandleIntent (Intent intent) i podejmowania rozmowy na zadania asynchronicznym

onHandleIntent() nazywa się na wątku tła. Nie można wykonać AsyncTask z wątku tła.

Co ważniejsze, nie potrzebujesz AsyncTask. Po prostu weź swój kod doInBackground() i umieść go w onHandleIntent().

+0

Tak, nie potrzebuję AsyncTask. Nie myśl o tym wcześniej. Dzięki za podpowiedź. I jeszcze jedna rzecz w moich powiadomieniach chcę wyświetlać tylko dużą ikonę, więc jak mogę wyłączyć małą ikonę, ponieważ ustawienie małej ikony jest obowiązkowe (przy użyciu .setSmallIcon() w instancji NotificationCompat.Builder)? – FingerSmith

+0

Wykonano także zadanie asynchroniczne, chociaż instrukcja execute została podkreślona w kolorze czerwonym. – FingerSmith

+0

@ FingerSmith: "Także w moich powiadomieniach chcę pokazać tylko dużą ikonę" - musiałbyś zbudować własną mobilną operację system. Mała ikona pojawia się na pasku stanu, a jej obecność jest niezbywalna. – CommonsWare

Powiązane problemy