gpt4 book ai didi

java - AsyncTask 一段时间后停止

转载 作者:行者123 更新时间:2023-12-02 13:20:18 24 4
gpt4 key购买 nike

我有一个 CustomAsyncTask 类,可以启用无限条码扫描仪,并在 CustomApplication 中执行它。
不幸的是,CustomAsyncTask::doInBackground在一段时间(一两分钟)后停止。

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();
}
}
}
}
}

最佳答案

使用 Service而不是 AsyncTask。 AsyncTasks 仅设计用于运行较短的后台任务。请记住,您在 Service 中运行的任何内容都将在主线程上执行,因此您应该在 Service 中使用后台线程。

你能说出 AsyncTask 或 IntentService 停止的原因吗?使用 IntentService 和 while(true) 循环,它应该无限期地运行,除非应用程序因某种原因关闭。

编辑 -

您需要这样做以防止循环阻塞主线程 -

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{

Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
// your code here
}
}
});
t.start();
}

我不知道为什么您的服务停止了。您需要查看 Logcat 输出。将过滤器设置为“错误”,您的崩溃应该会显示在那里。

关于java - AsyncTask 一段时间后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43594177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com