0

我的应用程序有一个数据库,如果它没有注意到与 Wifi 或移动网络的任何连接,例如 3G og 4G,它将存储排队的项目。我的问题是:

我有一个BroadcastReciever以这种方式注册的:

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

BroadcastReciever正在开始Service从该数据库中挑选项目并通过网络服务或邮件发送它们。我的 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 回答