我有一個擴展IntentService的類,讓我們說類A,然後我有2個更多的類作爲類B和類C,這些類擴展了類A.原因是因爲我想初始化所有內容A類使代碼將在B類和C所以B類和C的onHandleIntent
方法被重用的樣子:IntentService併發
@Override
protected void onHandleIntent(Intent intent) {
super.onHandleIntent(intent);
//Specific init stuff
}
我想要做的就是簡單地做在A類的任何構造函數或onHandleIntent
一些併發檢查。例如,當正在使用方法x(哪個類使用它無關緊要)時,我希望能夠標記此方法正在使用。有時一種方法使用Handler.postDelayed
來安排另一個線程,所以我想確保該標誌在使用前一直保留,直到完成工作。
到目前爲止,它聽起來像它可以很容易地共享單身然而做,每個類都有自己的AlarmManager
延伸BroadcastReceiver
,所以使用的是共享單並未真正發揮一個單身的生命週期爲存在不保證。
我能想到的唯一解決方案是使用數據庫或本地文件系統,這聽起來很愚蠢。那麼是否有另一種方法來標記由AlarmManager
觸發的不同IntentService
之間的併發方法?
爲了給出一個清晰的圖像,我想給A類,B類和C類
public class A extends IntentService {
public A(String name) {
super(name);
//initialise objects here
}
@Override
protected void onHandleIntent(Intent intent) {
//initialise objects that uses intent here
}
protected synchronized void methodA() {
//wait until flagB is free
flagA = in_use; //Flag something as being in use here
//change some objects here
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//do some stuff with objects
flagB = not_in_use; //Flag something as being free here
}
}, (1000 * 45));// 45secs
}
protected synchronized void methodB() {
if (flagA == not_in_use) {
flagB = in_use;
//do some stuff with objects
flagB = not_in_use;
}
else {
//do something else
}
}
public class B extends IntentService {
public A(String name) {
super("B");//Super initializes everything
}
@Override
protected void onHandleIntent(Intent intent) {//This will run every 30 minutes
super.onHandleIntent(intent);
methodA();
}
}
public class C extends IntentService {
public A(String name) {
super("C");//Super initializes everything
}
@Override
protected void onHandleIntent(Intent intent) {//This will run every 45 minutes
super.onHandleIntent(intent);
methodB();
}
}
所以基本上B級和C不包含任何私有類的一個實例。我想要做的就像上面的例子,標記事物。 問題是,正如我所說,如果它僅僅是一個靜態字段,那麼靜態字段可能無法留在作爲Android操作系統可以殺死任何不活躍節省內存的內存。
謝謝,但那不是我真正想問的。正如我所提到的,我有Handler.postDelayed()。 因此,對於foo()方法,它會簡單地結束,但稍後延遲的線程可能會與另一個正在運行的方法同時觸發。 –
我不明白你的代碼/線程結構和concurreny要求給出任何具體的建議,但你通常會使用所有的常規併發實用程序。 'Handler.post..'通常會將執行移動到主線程中(除非您使用'HandlerThread'),並且不應該在那裏阻塞。所以要小心。嘗試添加一些解釋你想要做什麼的代碼。 – zapl
我現在增加了一個例子。 –