0

我有一个BroadcastReceiver可以监控我与 Wifi 或移动网络的连接状态。这样做的重点是在手机建立连接时BroadcastReceiver访问 a 。SQLite Database

所以在我的onPause方法中,我注册了接收者:

networkMonitor = new CaseQueueReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);        
registerReceiver(networkMonitor, filter);

在我的onDestory方法中,我取消注册它

unregisterReceiver(networkMonitor);

到这个 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 的两种方法

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方法会被调用这么多次?解决此问题的最佳方法是什么?

提前致谢!

4

1 回答 1

2
public static final String CONNECTIVITY_ACTION

Added in API level 1
A change in network connectivity has occurred. A connection has either been established or lost. The NetworkInfo for the affected network is sent as an extra; it should be consulted to see what kind of connectivity event occurred.

If this is a connection that was the result of failing over from a disconnected network, then the FAILOVER_CONNECTION boolean extra is set to true.

For a loss of connectivity, if the connectivity manager is attempting to connect (or has already connected) to another network, the NetworkInfo for the new network is also passed as an extra. This lets any receivers of the broadcast know that they should not necessarily tell the user that no data traffic will be possible. Instead, the reciever should expect another broadcast soon, indicating either that the failover attempt succeeded (and so there is still overall data connectivity), or that the failover attempt failed, meaning that all connectivity has been lost.

For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY is set to true if there are no connected networks at all.

Constant Value: "android.net.conn.CONNECTIVITY_CHANGE"
于 2012-11-24T12:58:50.450 回答