我有一個CustomAsyncTask類,它啓用無限條形碼掃描器,並在CustomApplication中執行它。
不幸的是CustomAsyncTask::doInBackground
在一段時間後(一兩分鐘)停止。AsyncTask在一段時間後停止
private class ScanAsync extends AsyncTask<Void, String, Void>
{
boolean blocked = false;
@Override
protected Void doInBackground(Void... params)
{
while(true)
{
if (!blocked)
{
String received = GlobalAccess.scan.scan(500);
if (received != null && !received.isEmpty())
{
blocked = true;
publishProgress(received);
}
}
else
{
try
{
Thread.sleep(500);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
@Override
protected void onProgressUpdate(String... values)
{
super.onProgressUpdate(values);
//TODO: something with received value
blocked = false;
}
}
我需要這個後臺任務永遠在。有沒有什麼好的解決方案?我試過IntentService,但結果是一樣的 - 一段時間後它停止工作。
編輯
我創造了這個服務,雖然它擋住了我的主線程,但它應該在後臺工作的權利?另外,如果我在if(!blocked)
上放置了一個斷點並按F9,它可以正常工作(掃描部分),但是如果我刪除斷點並讓它運行 - 幾秒鐘後它就會關閉(掃描儀),但如果我再次放置斷點 - 再次(原文如此!)。
public class ScanService extends Service
{
boolean blocked = false;
public ScanService()
{
}
@Nullable
@Override
public IBinder onBind(Intent intent)
{
return null;
// TODO: Return the communication channel to the service.
//throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
while(true)
{
if (!blocked)
{
String received = GlobalAccess.scan.scan(500);
if (received != null && !received.isEmpty())
{
//blocked = true;
}
}
else
{
try
{
Thread.sleep(500);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
}
安置自己的堆棧跟蹤中如何使用它的一個例子。 'AsyncTask'應該最多使用幾秒鐘。如果你需要某些東西無限期地運行,那麼使用一個服務和一個線程。如果它仍然崩潰,那麼代碼中存在問題。 – Pztar
我建議你爲這些工作使用JobDispatcher。 – HaroldSer