0

mongodbデータベースを更新してユーザーがアプリケーションを開いたり閉じたりするときにアプリケーションが追跡するメソッドを実装しようとしています。 アクティビティの開始時にonCreate()またはonResume()メソッドが常に開始され、アクティビティが終了するときにonPause()またはonStop()メソッドが呼び出していることがわかります。私がこれまで試した「VEの何閉じる/開始アプリケーションでユーザーを追跡

はこれです:私が使用し

のonCreate()、onResume()で
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; 
    } 
} 

方法:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), false); 
私のアプリケーション私はこのAsyncTaskを呼び出していますが、すべての活動で私が使用

そして、onPause()、onStop()メソッド:

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

私は、これが働いて、私の文書のウィットを更新する必要があることだと思いますhユーザーのオンライン/オフライン状況ですが、そうではありません。私はこれがAsyncTaskのためにアプリケーションがバックグラウンドで動作していないか、または私が何か間違っているときに動作していないのだろうかと思います。とにかくどんな助けも大歓迎です。

EDIT

Log.d()AsyncTaskのptintsのYはなく、Xは。 AsyncTaskはonCreate()メソッドでは実行されていますが、onStop()では実行されません。

私のアプリではアクティビティを変更してテストしました。アプリケーションのアクティビティを変更しているときや、スマートフォンの中央ボタンを押して(バックグラウンドに送信したとき)、オンラインフィールドがデータベースで更新されます。メソッドが完全に閉じているときにだけメソッドが動作していません

+0

'BasicDBObject'が何であるかを見ることなく、そこに問題がある可能性があります。しかし、あなたのログが 'y'ブロックに当たっていて、 'x'ではない場合は、ログインの真の値で 'updateOnline()'を呼んでいますか? アプリケーションをデバッグし、コードを1行ずつ進めましたか?各ステップで期待したとおりの変数の価値はありましたか? –

+0

私は自分のアプリでアクティビティを変更してテストしました。アプリケーションのアクティビティを変更しているときや、スマートフォンの中央ボタンを押して(バックグラウンドに送信したとき)、オンラインフィールドがデータベースで更新されます。このメソッドは、完全に閉じているときにのみ機能しています。 –

答えて

2

短いバージョンは "you should avoid performing CPU-intensive work during onPause(), such as writing to a database"です。これはmanaging the activity lifecycleからです(これは推奨された読み取りです)。

ただし、あなたと他の人が指摘しているように、アプリを一時停止して停止しても、バックグラウンドスレッドは停止しません。アプリケーションを完全に閉じると、onDestroyが呼び出されます。これはすべてを殺す(名前が意味するように)。

また、アクティビティを一時停止すると、UIが部分的に隠されていることを意味します。これは、アラートウィンドウがその上に表示されたときに発生します。しかし、onPauseのほとんどの場合は、onStopの直前に発生します。アプリケーションがまだ実行中であるかどうかにかかわらず、「システムメモリを回復する必要がある場合、システムはインスタンスを破棄する可能性があります。

onPauseでCPUを大量に消費しないようにするための推奨事項は、onStopには適用されません。 Google's example shows writing to storage。そこには指定されていませんが、実際には、バックグラウンドスレッドを生成するのは悪い考えです。システムはonStestの準備ができているとシステムが想定しているので、onStopが存在します。

私の元の推奨はまだ成り立ちます。アクティビティのonDestroy Serviceを作成した場合、それには適用されません。

+0

_ "onPauseとonCloseを実行した後、アプリケーションがシャットダウンされました" _これは真ではありません。 _ "アクティビティのバックグラウンドスレッドを含む" _それは本当ではありません。 – Onik

+0

サービスを開くことは何を意味しますか?例えばPHPファイルを呼び出すのと同じですか? –

+0

また、アクティビティがバックグラウンドになると、タスクは正常に動作しており、フィールドは自分のデータベースで更新されます。フィールドが更新されないのは、アプリケーションを完全に終了するときだけです。 –

関連する問題