服务使UI冻结

时间:2013-02-28 12:10:00

标签: android

我的应用程序有一个数据库,如果没有注意到任何与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,则不会触发此服务。为什么会这样?

3 个答案:

答案 0 :(得分:1)

  

我的问题是,当我启动应用程序时,这将阻止UI一段时间,然后显示UI。

服务在UI线程中运行。这就是问题所在。

答案 1 :(得分:1)

您可以尝试使用IntentService。它会自动处理所有线程。

答案 2 :(得分:0)

您应该创建AsyncTask或处理服务的新线程。