Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android异步任务减慢我的UI线程_Android_Android Asynctask - Fatal编程技术网

Android异步任务减慢我的UI线程

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

我是Android应用程序开发新手,在异步任务方面遇到了问题。 因此,我试图创建一个ECG绘图应用程序,在绘图过程中进行一些后台处理

我已经定义了以下异步任务-

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资源的原因。