Android异步任务减慢我的UI线程
我是Android应用程序开发新手,在异步任务方面遇到了问题。 因此,我试图创建一个ECG绘图应用程序,在绘图过程中进行一些后台处理 我已经定义了以下异步任务-Android异步任务减慢我的UI线程,android,android-asynctask,Android,Android Asynctask,我是Android应用程序开发新手,在异步任务方面遇到了问题。 因此,我试图创建一个ECG绘图应用程序,在绘图过程中进行一些后台处理 我已经定义了以下异步任务- private class Erosion extends AsyncTask <Void,Void,Void> { @Override protected Void doInBackground(Void...unused ) { int i,tempIndex; do
private class Erosion extends AsyncTask <Void,Void,Void> {
@Override
protected Void doInBackground(Void...unused ) {
int i,tempIndex;
double[] tempArray = new double[13];
double min = ecgSamples[ecgSampleForErosionIndex] - gArray[0];
while (ecgIncoming)
{
if (ecgSampleForErosionIndex > 179999)
{
ecgSampleForErosionIndex = 0;
}
for(i= 0;i<13;i++)
{
tempIndex = ecgSampleForErosionIndex + i;
if (tempIndex > 179999)
{
tempIndex = (ecgSampleForErosionIndex + i) - 180000;
}
tempArray[i] = ecgSamples[tempIndex] - gArray[i];
if (tempArray[i] < min)
{
min = tempArray[i];
}
}
//min needs to be stored in the erosionFirst Array
if (erosionFirstArrayIndex > 179999)
{
erosionFirstArrayIndex = 0;
}
ecgErosion[erosionFirstArrayIndex] = min;
erosionFirstArrayIndex++;
ecgSampleForErosionIndex++;
}
return null;
}
} //End of Async Task
私有类任务{
@凌驾
受保护的空位背景(空位…未使用){
int i,临时索引;
double[]临时数组=新的double[13];
双最小值=ECG样本[ECG样本前松香指数]-gArray[0];
当(埃金康)
{
如果(ecgSampleForErosionIndex>179999)
{
ecgSampleForErosionIndex=0;
}
对于(i=0;i 179999)
{
临时指数=(ecgSampleForErosionIndex+i)-180000;
}
tempArray[i]=ecgSamples[tempIndex]-gArray[i];
if(临时数组[i]179999)
{
侵蚀FirstArrayIndex=0;
}
ecgErosion[EROSIONFIRSTARYINDEX]=min;
侵蚀指数++;
ecgSampleForErosionIndex++;
}
返回null;
}
}//异步任务结束
所以我所要做的就是修改异步任务中特定数组的内容——我不需要更新UI(至少现在不需要)
然而,当我运行这个异步任务时,我的ECG图形速度减慢,变得急促。当我注释掉启动异步任务的代码中的“new permission().execute();”部分时,图形再次变得正常
异步任务不应该在一个单独的线程上,这样就不会影响UI线程上发生的事情吗?我做错了什么 您是否正在运行
新侵蚀().execute()代码>多次?这可能是因为您多次分配新的AsyncTask
。即使您在后台线程上运行一段繁重的代码,它仍会影响设备的CPU负载,因此也可能导致UI线程延迟,特别是当设备具有单核CPU时
看起来在你的后台方法中有一个很重的循环,它经常运行,只是不停地使用CPU,这会使它过载。我不知道这个循环是什么,但是如果它不需要不断刷新,你可能需要考虑添加一个线程睡眠,允许其他线程获得更多的CPU时间:
while (ecgIncoming)
{
... do your thing ...
Thread.sleep(100); // wait for 100 milliseconds before running another loop
}
很明显,“100”只是一个数字,如果数组可以每秒更新一次,则将其设置为1000,等等。是的,我一直在运行异步任务,因为我使用ECG数据实时计算心率。这是一项相当繁重的工作,所以我想你的解释是有道理的。除了异步任务之外,我还可以使用其他的东西来执行恒定的后台计算工作吗?@stu90:“除了异步任务之外,我还可以使用其他的东西来执行恒定的后台计算工作吗?”——这不会改变你的问题。该线程已经设置为后台优先级,但这对繁忙循环没有多大帮助。几十年来,像这样的繁忙循环一直被认为是糟糕的形式。正如Talihawk所建议的,您需要建立一个采样率,并允许其他线程在CPU上运行。您也可以更好地使用自己的线程,而不是无限期地从AsyncTask
池中捆绑一个线程。@stu90您可以使用服务而不是异步任务,但我怀疑仅此一点就不会对性能产生多大影响。您可以将该服务分配到一个单独的Linux进程上运行,但我也不能说这是否重要。这应该会帮助你开始:谢谢你的帮助!我将尝试以不同的方式进行后台处理,这样异步任务就不会总是在繁忙的循环中运行。不,只运行一次!但是它在后台运行了很长一段时间。。所以我想这就是它占用太多CPU资源的原因。