Androidプログラミングの初心者で、私はこのプロジェクトに取り組んでいました。この質問はかなり長いので、これが取り引きです。
この GCMIntentService クラスを拡張GCMBaseIntentService
すると、サーバーからメッセージが到着するたびに、メッセージがGCMBroadcastReceiver
自動的に認識さonMessage()
れ、GCMIntentService クラスでオーバーライドされたメソッドが呼び出されます。本文ではonMessage
、でいくつかの操作を行っており、onMessage 本文内の ui スレッドでSQLiteDatabase
を呼び出して、リスト ビューのアダプターに通知しています。adapter.notifyDataSetChanged()
現在、2 つまたは 3 つ以上の gcm メッセージが同時にデバイスに送信されると、複数のスレッドが同じonMessage()
メソッドを呼び出しており、データベースとアダプターも混乱しているため、アプリがクラッシュします。一度に 1 つのスレッドだけが使用する必要があるメソッドで、synchronized キーワードを使用する必要があると考えました。
しかし、私のonMessage
メソッドはオーバーライドされたメソッドであるため、別のメソッドを作成して同期修飾子を配置することにしましたがrunOnUiThread()
、リスト ビューのアダプターに変更を通知する必要があるため、そのメソッド内からメソッドを呼び出す必要があります。
これが正しい方法であるかどうか、または私の問題に対してより簡単な解決策を使用することが可能かどうかを尋ねたいだけです。
以下は、m が行っていることのサンプル コードです。
@Override
protected void onMessage(Context arg0, Intent intent) {
// called when a new cloud message has been received
Log.w("Service ", "Started");
dbh = new DatabaseHandler(this);
sld = dbh.getWritableDatabase();
who = this;
// processing json object
putDataFromJSON();
//other stuff
}
synchronized private void putDataFromJSON(){
//do some work on JSON Object
//complete work on JSON by putting in database
dbh.saveInDB();
//notify the adapter
((MainActivity) MainActivity.con).runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
//do other stuffs as well
}
}
}