私は、無限バーコードスキャナを有効にする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を試しましたが、結果は同じでした - しばらくしてから作業を停止しました。
EDIT
それは私のメインスレッドをブロックするが、私は、このサービスを作成しているが、それは、バックグラウンドの右に動作するはず?また、私はif(!blocked)
にブレークポイントを置き、F9キーを押しても問題なく動作しますが、ブレークポイントを削除して実行させると数秒後には(スキャナー)は消えますが、再度ブレークポイントを置くと動作しますもう一度(ic!)。
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