我的應用程序中都有,如果沒有注意到任何連接到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,則不會觸發此服務。這是爲什麼發生?
我認爲服務沒有在UI線程上拼命地跑。我應該從服務中啓動一個AsyncTask嗎?那麼:BroadCastReciever-> Service-> AsyncTask? – 2013-02-28 12:15:45
如果你想要做長期運行的操作服務,你有兩個選擇:生成新線程(的AsyncTask可以做的工作),或使用IntentService(已經在單獨的線程中運行)。 – 2013-02-28 12:31:32