0

Uygulamamın bir kullanıcı bir mongodb veritabanını güncelleyerek uygulamayı açtığımda veya kapattığında izleyeceği bir yöntem uygulamaya çalışıyorum. Bir etkinlik başlatıldığında onCreate() veya onResume() yöntemlerinin her zaman başladığını ve bir etkinliğin kapatılmasının onPause() veya onStop() yöntemlerinin çağıracağını anlıyorum. Ben şimdiye kadar denedim neUygulamayı kapatma/başlatma uygulamasında izleme

şudur: i kullanmak

onCreate(), onResume() On
public void updateOnline(String fbid, boolean login){ 
    new updateOnlineAsync(fbid, login).execute(); 
} 

public class updateOnlineAsync extends AsyncTask<Void, Void, Void>{ 
    String fbid; 
    boolean login; 

    public updateOnlineAsync(String fbid, boolean login){ 
     this.fbid=fbid; 
     this.login=login; 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 
     BasicDBObject query = new BasicDBObject(); 
     query.put("fbid", this.fbid); 
     Document myDoc = fb_users.find(query).first(); 

     if(login){ 
      Log.d("...", "x"); 
      Document listItem = new Document("online", "0"); 
      Document updateQuery = new Document("$set", listItem); 
      fb_users.updateOne(myDoc, updateQuery); 
     }else{ 
      Log.d("...", "y"); 
      Document listItem = new Document("online", "1"); 
      Document updateQuery = new Document("$set", listItem); 
      fb_users.updateOne(myDoc, updateQuery); 
     } 
     return null; 
    } 
} 

yöntemleri:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), false); 
Uygulamam ben bu AsyncTask arıyorum her aktivitede

ve OnPause(), OnStop() yöntemleri i kullanın:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), true); 

Bu çalışma olması ve benim belge espri güncelleştirmek gerektiğini düşünüyorum Kullanıcı çevrimiçi/çevrimdışı durum h ama değil. Bu, uygulama arka planda çalışırken AsyncTask'ın çalışmıyor olmasından mı yoksa belki de yanlış bir şey yapıyorum diye merak ediyorum. Neyse, herhangi bir yardım çok takdir edilir.

DÜZENLEME

Log.d() AsyncTask ptints y ancak x. Orada AsyncTask

Sadece benim app aktivitesini değiştirerek test) (OnStop için onCreate() yöntemi için yürütme değil, için. Uygulamamdaki bir etkinliği değiştirdiğimde veya akıllı telefonumun orta düğmesine bastığımda (arka plana gönderirken) çevrimiçi alan veritabanımda güncellenir. Yöntem, yalnızca tamamen kapattığımda çalışmıyor.

+0

Ne 'BasicDBObject' olduğunu görmeden, orada bir sorun olabilir. Ancak, günlüğünüz 'y' bloğuna isabet ediyorsa, ancak 'x' değilse, loginOnline() 'ı, başlamak için giriş için gerçek bir değerle çağırdığınızdan emin misiniz? Uygulamayı hata ayıkladıktan sonra kod satırına adım attınız mı? Her adımda beklediğiniz gibi değişkenlerin değeri miydi? –

+0

Sadece uygulamamdaki etkinliği değiştirerek test oldum.Uygulamamdaki bir etkinliği değiştirdiğimde veya akıllı telefonumun orta düğmesine bastığımda (arka plana gönderirken) çevrimiçi alan veritabanımda güncellenir. Yöntem yalnızca tamamen kapattığımda çalışmıyor –

cevap

2

Kısa sürüm "you should avoid performing CPU-intensive work during onPause(), such as writing to a database" dur. Bu managing the activity lifecycle'dan (önerilen bir okumadır). Ancak, sizin ve başkalarının da belirttiği gibi, bir uygulamayı duraklatıp durdururken arka plan iş parçacığını durdurmaz. Uygulamayı tamamen kapattığınızda, OnDestroy denir. Bu herşeyi öldürür (adından da anlaşılacağı gibi). Ayrıca, etkinliği duraklatmak, UI'nin kısmen gizlendiğini ima eder. Bunun üstünde bir uyarı penceresi görüntülendiğinde bu olabilir. Bununla birlikte, çoğu onPause, on -top'tan hemen önce gerçekleşir. Uygulamanın hala çalışıp çalışmadığı, "Etkinliğiniz durdurulduktan sonra sistem, sistem belleğini kurtarması gerekiyorsa, sistemi yok edebilir."

onPause sırasında CPU'yu yoğun önlemeye yönelik öneri onStop için geçerli değildir. Google's example shows writing to storage. Orada belirtilmemiş ama aslında bunun için bir arka plan iş parçacığı oluşturmanın kötü bir fikir olduğunu düşünürdüm, çünkü sistem etkinliğin bir kez OnStop üzerinde hazır olduğunu varsayabilir.

Orijinal önerim hala geçerli. Bir etkinlikte onDestroy bir Service oluşturursanız, bunun için geçerli olmaz.

+0

_ "OnPause ve onClose çalıştırıldıktan sonra, uygulama kapatıldı" _ Bu doğru DEĞİL. _ "etkinliğin herhangi bir arka plan iş parçacığı dahil" _ Bu doğru DEĞİLDİR. – Onik

+0

Servis açmak ne demek istiyorsun? Örneğin bir php dosyasını çağırmak gibi mi? –

+0

ayrıca, etkinlik arka plana giderken görev iyi çalışıyor, alan veritabanımda güncelleniyor. Alan sadece uygulamayı tamamen kapattığımda güncellenmiyor –