Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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_Ui Thread - Fatal编程技术网

Android UI线程时间问题

Android UI线程时间问题,android,ui-thread,Android,Ui Thread,关于Android中的UI线程,我有一个问题: 我的活动扩展了AsyncTask以对wave文件进行一些计算。如果我只运行一次应用程序,大约需要15分钟才能完成。这对我来说不是问题。 我想多次启动该过程(例如4次,因为我有4个wave文件),因此我预计时间为1小时(15分钟*4=1小时),但事实并非如此,它会持续大约3小时 为了多次启动该进程,我创建了一个函数,该函数调用“newprocesstask().execute();”4次,并在“onPostExecute”中调用该函数 你有ide吗?

关于Android中的UI线程,我有一个问题:

我的活动扩展了AsyncTask以对wave文件进行一些计算。如果我只运行一次应用程序,大约需要15分钟才能完成。这对我来说不是问题。 我想多次启动该过程(例如4次,因为我有4个wave文件),因此我预计时间为1小时(15分钟*4=1小时),但事实并非如此,它会持续大约3小时

为了多次启动该进程,我创建了一个函数,该函数调用“newprocesstask().execute();”4次,并在“onPostExecute”中调用该函数

你有ide吗?为什么我运行多次需要更多的时间

提前谢谢你的帮助

public  void processingRespiratoryFiles() {

        if(p<=MainActivity.count)
        {
        filePath = Environment.getExternalStorageDirectory() + "/external_sd/AudioRecorder/audio"+p+".wav";

        File filein = new File(filePath);
        if (filein.exists()) 
            new ProcessTask().execute();


        }
        else
        {
        RespiratoryHandling(ODI_Sum,0);
        Index.setText(Double.toString(ODI_Sum));
        message2=ODI_Sum;
        }


    }





private class ProcessTask extends AsyncTask<Void, Void, Integer> {

        ProgressDialog dialog;

        @Override
        protected Integer doInBackground(Void... params) {
            return process(filePath);
        }

        @Override
        protected void onPostExecute(Integer result) {////////////////////////////////////////////////////////
            dialog.dismiss();
            if (result > -1)
            {
                p++;
                ODI=(double)result/NumberOfHours;
                ODI_Sum+=ODI;
                processingRespiratoryFiles();


            }
        }

        @Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(
                    Diagnose.this, "Diagnosing, please wait",
                    "Processing...");
        }
    }


    /**
     * Reset ring buffer for filter process before filtering signal
     * @param alength number of a coefficients
     * @param blength number of a coefficients
     */
    public void resetRingBuffer(int alength, int blength) {
        xv = new double[blength + 1];
        yv = new double[alength + 1];

        px = 0;
        py = 0;
    }

    /**
     * Filter each second of signal and then compute the energy of output
     * @param din input stream of audio file
     * @param length number of read samples
     * @param numChannels number of channels of signal
     * @return energy value of 1 second filtered signal 
     */
    public double readEnergyFiltered(DataInputStream din, int length,
            int numChannels) {
        double energy = 0.0;

        try {
            byte[] byteBuffer = new byte[length * 2 * numChannels]; // 16 bit

            // read length samples from file's stream
            int r = din.read(byteBuffer); // bytes read
            // if reach to end of file
            if (r == -1)
                return -1.0;
            r = r / (2 * numChannels); // samples read

            // apply the filter
            for (int i = 0; i < r; ++i) {
                // get the new sample
                short sample = (short) ((byteBuffer[2 * numChannels * i] & 0xff) | (byteBuffer[2
                        * numChannels * i + 1] & 0xff) << 8);
                xv[px] = (double) sample / 32768.0;

                // compute the output
                double y = bcoef[0] * xv[px];
                for (int j = 1; j < bcoef.length; ++j)
                    y += bcoef[j] * xv[(px - j + xv.length) % xv.length];
                for (int j = 1; j < acoef.length; ++j)
                    y -= acoef[j] * yv[(py - j + yv.length) % yv.length];

                // save the result
                yv[py] = y;

                // update energy
                energy += y * y;

                // increment the index of the ring buffer
                px = (px + 1) % xv.length;
                py = (py + 1) % yv.length;
            }

            return energy;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1.0;
    }

    /**
     * Process the filtering, computing energy and estimating number of events 
     * @param filePath path to audio file on sd card
     * @return number of events
     */
    private int process(String filePath) {
        try {
            int event = 0;
            double sum =0.0;

            byte[] header = new byte[44];

            File filein = new File(filePath);
            FileInputStream fin = new FileInputStream(filein);
            BufferedInputStream bin = new BufferedInputStream(fin);
            DataInputStream din = new DataInputStream(bin);

            din.read(header);

            // Sample Rate
            int fs = (header[24] & 0xff) | (header[25] & 0xff) << 8
                    | (header[26] & 0xff) << 16 | (header[27] & 0xff) << 24;
            double Ts = 1.0 / fs;
            Log.v("PERM", "Sample Rate: " + String.valueOf(fs));

            // Num Channels
            int numChannels = (header[22] & 0xff) | (header[23] & 0xff) << 8;
            Log.v("PERM", "Num Channel: " + String.valueOf(numChannels));

            // Bits Per Sample
            int bitsPerSample = (header[34] & 0xff) | (header[35] & 0xff) << 8;
            Log.v("PERM", "Bits per sample: " + String.valueOf(bitsPerSample));

            // Sample Rate
            int numBytes = (header[40] & 0xff) | (header[41] & 0xff) << 8
                    | (header[42] & 0xff) << 16 | (header[43] & 0xff) << 24;
            int N = numBytes / numChannels / (bitsPerSample / 8);
            Log.v("PERM", "Data Length: " + String.valueOf(N));

            // Calibration phase
            // Find average energy for the first 180 seconds
            double energy = 0.0;
            resetRingBuffer(acoef.length, bcoef.length);
            for (int i = 0; i < 30; i++) {
                sum = readEnergyFiltered(din, fs, numChannels);
                energy += sum * Ts;
            }
            if(MainActivity.count==1)
            {
             mean_energy = energy / 30.0;
             ThresholdR = 0.8 * mean_energy;
            }

            Log.v("PERM", "Threshold: " + String.valueOf(ThresholdR));

            // process hold file
            resetRingBuffer(acoef.length, bcoef.length);
            din.close();
            bin.close();
            fin.close();

            fin = new FileInputStream(filein);
            bin = new BufferedInputStream(fin);
            din = new DataInputStream(bin);
            din.read(header);

            N = N / fs;
            int j = 1;
            while (j <= N) {
                int counter = 0;
                //int trigger = 0;
                energy = readEnergyFiltered(din, fs, numChannels) * Ts;
                if (energy >= 0.) {

                    Log.v("PERM", "Energy " + String.valueOf(energy));
//while ((energy <= Threshold) || (trigger < 4))
                    while ((energy < ThresholdR)) {
                        counter++;
                        energy = readEnergyFiltered(din, fs, numChannels) * Ts;
                        Log.v("PERM", "Inner Energy " + String.valueOf(energy));
                        if (energy < 0)
                            break;
                        //trigger++;
                    }
                }

                if (counter > 10)
                    event++;

                if (counter > 0)
                    j += counter;
                else
                    j++;
            }

            Log.v("PERM", "Event: " + String.valueOf(event));

            din.close();
            bin.close();
            fin.close();

            return event;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return -1;
    }
public void processingRespiratoryFiles(){
如果(p-1)
{
p++;
ODI=(双)结果/小时数;
ODI_Sum+=ODI;
ProcessIngregatoryFiles();
}
}
@凌驾
受保护的void onPreExecute(){
dialog=ProgressDialog.show(
诊断。这是“诊断,请稍候”,
“处理……”;
}
}
/**
*在过滤信号之前,为过滤过程重置环形缓冲器
*@param alength系数的个数
*@param a系数的混合数
*/
公共无效重置缓冲区(int-alength,int-blength){
xv=新的双[混合度+1];
yv=新的双[alength+1];
px=0;
py=0;
}
/**
*对每秒钟的信号进行滤波,然后计算输出能量
*@param-din音频文件的输入流
*@param-length读取样本数
*@param numChannels信号通道数
*@1秒滤波信号的返回能量值
*/
公共双读能量过滤(数据输入流din,整数长度,
整数通道){
双能量=0.0;
试一试{
byte[]byteBuffer=新字节[长度*2*数字通道];//16位
//从文件流中读取长度示例
int r=din.read(byteBuffer);//字节读取
//如果到达文件末尾
如果(r==-1)
回报率-1.0;
r=r/(2*numChannels);//读取样本
//应用过滤器
对于(int i=0;i
尽管我不得不说,如果你愿意等待15分钟异步任务完成,那么你的应用程序是不寻常的。

这确实需要在IntentService中完成。如果你使用AsyncTask并意外翻转设备,你的活动将重新启动,异步任务将消失。IntentService将允许你“移动”远离当前的活动


虽然,我不得不说,如果你愿意等待15分钟来完成异步任务,那么你的应用程序是不寻常的。

你能发布你的代码吗?我的第一个想法是问你正在处理的.wav文件有多大。如果进程线程在每个线程都有机会处理时将wav文件加载到内存中,那么你会看到一个错误太慢了。@TheCapn,wave文件是1小时(300 MB),当我手动一个接一个地提供wave文件时,每个都需要15分钟,但是当我使用一个函数并多次调用它时,我需要更多的时间。您可能需要重设正在使用的一些变量。这只是一个猜测,因为我没有看到您调用的代码
new ProcessTask().execute();
在postExecute中执行一次,并在每次postExecute中执行(前4次postExecutes)?我们需要你的代码。你能发布你的代码吗?我的第一个想法是询问你正在处理的.wav文件有多大。如果进程线程在每个线程都有机会处理时将wav文件加载到内存中,那么你会看到很大的减速。@TheCapn,wav文件是1小时(300 MB),当我手动一个接一个地提供wave文件时,每个都需要15分钟,但是当我使用一个函数并多次调用它时,我需要更多的时间您可能需要重置正在使用的一些变量。这只是一个猜测,因为我没有看到您调用的代码
new ProcessTask().execute()
在postExecute中执行一次,并在每次postExecute中执行(前4次postExecutes)?我们需要您的代码。