2013-02-28 111 views
0

我的應用程序中都有,如果沒有注意到任何連接到WLAN或移動網絡,如3G網絡OG 4G排隊的項目將被存儲在數據庫中。我的問題是:服務使得UI凍結

我有的registrered這樣一個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從該數據庫中選取出來的物品,並將它們發送無論是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); 
      } 
     } 
    } 
} 

正如你可以看到,如果Internet連接可用並且數據庫中包含的東西,我將開始服務於數據庫中發送這些項目。

我的服務是這樣的:

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,然後顯示用戶界面。另外一個問題是,如果我關閉並再次打開WiFi,則不會觸發此服務。這是爲什麼發生?

回答

1

我的問題是,當我啓動應用程序,這將阻止用戶界面一段時間,然後顯示用戶界面。

服務運行在UI線程。那就是問題所在。

+0

我認爲服務沒有在UI線程上拼命地跑。我應該從服務中啓動一個AsyncTask嗎?那麼:BroadCastReciever-> Service-> AsyncTask? – 2013-02-28 12:15:45

+1

如果你想要做長期運行的操作服務,你有兩個選擇:生成新線程(的AsyncTask可以做的工作),或使用IntentService(已經在單獨的線程中運行)。 – 2013-02-28 12:31:32

0

您應該創建一個AsyncTask或一個新的線程它處理服務。

1

你可以嘗試使用IntentService。它將自動處理所有線程。