0

私のアプリケーションには、Wifi やモバイル ネットワーク (3G や 4G など) への接続が認識されない場合に、キューに入れられたアイテムが保存されるデータベースがあります。私の問題は次のとおりです。

私はBroadcastRecieverこの方法で登録されているを持っています:

@Override
public void onResume() {
  super.onResume();
  if(networkMonitor == null)
     networkMonitor = new CaseQueueReceiver();      
  IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);        
  registerReceiver(networkMonitor, filter);
}

BroadcastRecieverService、このデータベースから項目を選択し、Web サービスまたはメールで送信することを開始しています。私の BrodcastReciever は次のようなものです:

public class CaseQueueReceiver extends BroadcastReceiver {

    boolean available;
    QueueDB queueDB;
    int count;


    public CaseQueueReceiver() {
        queueDB = new QueueDB(ContextHelper.context());
        count = queueDB.countUnsentCases();
    }

    @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);

            if (available && count > 0) {
                Intent service = new Intent(context, SendQueuedCasesService.class); 
                context.startService(service);
            }
        }
    }
}

インターネット接続が利用可能で、データベースに何かが含まれているかどうかを確認できるように、これらのアイテムをデータベースに送信するサービスを開始します。

私のサービスは次のようになります。

public class SendQueuedCasesService extends Service {


    boolean available;
    DatabaseHandler db;
    QueueDB queueDB;
    HashMap<String, String> queueHashMap;
    CreateTransaction transaction;
    String pcn, file;
    int sent;

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }


    @Override
    public void onCreate() {
        super.onCreate();   

        db = new DatabaseHandler(ContextHelper.context());
        queueDB = new QueueDB(ContextHelper.context());
        queueHashMap = new HashMap<String, String>();
        transaction = new CreateTransaction(ContextHelper.context());

        queueDB = new QueueDB(this);
        int count = queueDB.countUnsentCases();
        Log.w("Unsent cases count: ", Integer.toString(count)); 

        if (count > 0) {

            queueHashMap = queueDB.getUnsetCases(); 
            Iterator<Entry<String, String>> it = queueHashMap.entrySet().iterator(); 

            while(it.hasNext()) {

                Map.Entry pairs = it.next(); 
                pcn = pairs.getKey().toString();
                Log.w("PCN in Queued Cases: ", pcn); 

                file = pairs.getKey().toString();
                Log.w("Nist File Path: ", file); 

                try 
                {
                    sent = transaction.createTransaction(pcn, file);

                    if(sent == -2) 
                    {
                        queueDB.deleteUnSentCase(pcn);
                        db.updateDB(pcn, ""); 
                    }
                    else 
                        break; 

                } catch(MailException e) {
                    Log.e("MailException: ", e.getMessage());
                }
            }

            Intent i = new Intent(this, WorkflowChooser.getCurrentWorkflow());
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
    }
}

私の問題は、アプリケーションを起動すると、UI がしばらくブロックされてから UI が表示されることです。他の問題は、WiFi をオフにして再度オンにすると、このサービスがトリガーされないことです。なぜこうなった?

4

3 に答える 3

1

私の問題は、アプリケーションを起動すると、UI がしばらくブロックされてから UI が表示されることです。

サービスは UI スレッドで実行されます。それが問題です。

于 2013-02-28T12:12:39.820 に答える
1

使用してみることができますIntentService。すべてのスレッド化を自動的に処理します。

于 2013-02-28T12:31:39.817 に答える
0

AsyncTaskサービスを処理する 、または新しいスレッドを作成する必要があります。

于 2013-02-28T12:12:30.113 に答える