BroadcastReceiver
Wifi またはモバイル ネットワークへの接続状態を監視する があります。これの要点は、ハンドセットが接続を確立したときにBroadcastReceiver
にアクセスすることです。SQLite Database
したがって、私のonPause
方法では、受信者を登録します。
networkMonitor = new CaseQueueReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkMonitor, filter);
そして私のonDestory
方法では、登録を解除します
unregisterReceiver(networkMonitor);
このネットワークに渡って モニター受信機
public class CaseQueueReceiver extends BroadcastReceiver {
public boolean available;
DatabaseHandler db;
QueueDB queueDB;
HashMap<String, String> queueHashMap;
public CaseQueueReceiver() {
db = new DatabaseHandler(ContextHelper.context());
queueDB = new QueueDB(ContextHelper.context());
queueHashMap = new HashMap<String, String>();
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
String typeName = info.getTypeName();
String subtypeName = info.getSubtypeName();
available = info.isAvailable();
Log.i("Network Monitor", "Network Type: " + typeName
+ ", subtype: " + subtypeName
+ ", available: " + available);
//call a method which will get all the unsent cases from the database, and update their field of sent status
//in order to do so, add an extra column in the database, also remember to delete the cases.
if(available) {
int count = queueDB.countUnsentCases();
Log.i("Count unsentCases: ", Integer.toString(count));
queueDB.getUnsetCases();
// Iterator<Entry<String, String>> it = queueHashMap.entrySet().iterator();
// while (it.hasNext()) {
// Map.Entry pairs = (Map.Entry)it.next();
// Log.i("In the Queue: ", "PCN: " + pairs.getKey() + " Nist-File: " + pairs.getValue());
// }
}
}
}
そして、QueueDB からの私の 2 つのメソッド
public int countUnsentCases() {
String SQLQuery = "SELECT COUNT(" + PCN + ") FROM "
+ TABLE_CASES_IN_QUEUE + ";";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(SQLQuery, null);
cursor.moveToFirst();
int count = cursor.getInt(0);
cursor.close();
db.close();
return count;
}
public HashMap<String, String> getUnsetCases() {
HashMap<String, String> queueHashMap = new HashMap<String, String>();
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_CASES_IN_QUEUE + ";";
Cursor cursor = db.rawQuery(query, null);
if (cursor.moveToFirst()) {
do {
Log.i("CURSOR(0)", cursor.getString(0));
// queueHashMap.put(cursor.getString(0), cursor.getString(1));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return queueHashMap;
}
私が経験している問題は、onReceive
Wifi をオンにするとメソッドが無限に呼び出されることです。これにより例外が発生することはありません。アプリケーションがハングアップし、ヒープのメモリが消費されます。スレッドでデータベースの読み取り/書き込みを行う必要があることを認識しています。onReceive
このメソッドが何度も呼び出される理由を説明できる人はいますか? この問題を解決する最善の方法は何ですか?
前もって感謝します!