2010-11-18 12 views
1

Aklım karıştı Neden aktivitem hala devam ediyor, birkaç yönteme sahip uzaktan servisi kullanıyorum ve her şey indirme işleri, işlem verileri, karşılaştırmalar, vb. Gibi kendi çalışmalarına sahip ... Arka planda çalışacak ve verileri güncelleyecek seçilen aralıklarla sisteme bildirimde değişiklik bildirir.Hizmetimde ve handler.post yönteminde bir şeyler çalıştırdığımda neden etkinliğim hala devam ediyor?

Uzaktan hizmet neden, nedeni sonunda bir widget ekleyeceğim ve android etkinliğini öldürse bile hizmetin çalışmaya devam etmesi gerekiyor, bu yüzden her onPause() 'da bunu çözüyorum. Ama bildiğim kadarıyla bu bölüm benim sorunuma neden olmaz.

Ama benim sorunuma dönelim ... bu yüzden hizmet ve handler.post yönteminde bir şeyler yürüttüğümde etkinlik hala devam ediyor. Burada

kodudur:
public class WarnService extends Service { 

    private Bitmap pic; 
    private boolean dataUpToDate; 

    private void loadData(){ 
    //code that downloads new data and sets the dataUpToDate variable 
    } 

    private void updateLayer(Bitmap bt){ 
    //code that updates some stuff if downloaded and local data differ 
    } 

    private IWarnService.Stub WServiceStub = new IWarnService.Stub() { 

    @Override 
    public void refreshData() throws RemoteException { 
     serviceHandler.post(new Runnable() { 

     @Override 
     public void run() { 
      loadData(); 
      if(!dataUpToDate){ 
      updateLayer(pic); 
      } 
     } 
     }); 
    } 

    } 
} 

Ayrıca ben progressDialog eklemek istedim Aktivite yoluyla updateLayer (...) bu hizmete bir dinleyici olduğunu güncellenmesi, ama iyi çalışan thats. ProgressDialog'u güncellemenin en iyi yolu nedir? Hiç dinleyici, işleyici, niyet, ya da ne?

Bunu nasıl doğru şekilde yapabilirim? Hizmetiniz arka planda bazı ağır işleme sahipse, etkinliğiniz hala biraz gecikme yaşayabilir.

cevap

0

Bir Konu eklemek ve ona işleyicisi eklemeyi unuttunuz. Yani eksik kod:

private HandlerThread hThread; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    hThread = new HandlerThread("Processing thread"); 
    hThread.start(); 
    serviceHandler = new Handler(hThread.getLooper()); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    hThread.getLooper().quit(); 
} 
1

Hizmetinizde kullandığınız iş parçacıklarının önceliğini azaltmayı deneyin. Projelerimden birinde benzer bir sorun yaşadım, arka plan iş parçacıklarının önceliklerini PRIORITY_BACKGROUND (ya da buna benzer bir sabit) olarak belirledim ve bunu çözdüm.

Düzenleme: burada iplik öncelikleri hakkında bilgi edinebilirsiniz: http://developer.android.com/reference/android/os/Process.html

+0

Ben Process.setThreadPriority (Process.THREAD_PRIORITY_BACKGROUND) ekledim; run() içine ve hiçbir şey değişmedi. Yöntemlerimin hala GUI dizisinde çalıştığından eminim, neden emin değilim. – danizmax