Android - AsyncTask onProgressUpdate被调用但不是“按预期”?

时间:2016-06-02 06:25:40

标签: android multithreading android-asynctask

还有一个问题,我来了。使用Async任务如下:

private class ProcessFileTask extends AsyncTask<Void, byte[], Void>{
        String fileName;
        BufferedReader bufferedReader;
        String[] splitData;
        byte[] currentArray;
        ByteBuffer bb;

        public ProcessFileTask(String fileName) {
            this.fileName = fileName;
            currentArray = new byte[19];
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                bufferedReader = new BufferedReader(new FileReader(fileName));
                splitData = bufferedReader.readLine().split(" ");
                for (int i = 0; i < splitData.length; i += 19) {
                    for (int j = 0; j < 19; j++) {
                        currentArray[j] = Byte.parseByte(splitData[i+j]);

                    }
                    publishProgress(currentArray);
                }

            }
            catch (Exception e){
                Log.e("Exception occured", e.toString());
            }
            return null;
        }



        @Override
        protected void onProgressUpdate(byte[]... values) {
            super.onProgressUpdate(values);
            bb = ByteBuffer.allocate(20);
            bb.order(ByteOrder.LITTLE_ENDIAN);
            bb.put(values[0], 1, 18);
            ChannelOne.updateGraph(bb.getShort(0), bb.getShort(2), bb.getShort(4));
            ChannelTwo.updateGraph(bb.getShort(12), bb.getShort(14), bb.getShort(16));

        }
    }

在执行的这一部分:

for (int i = 0; i < splitData.length; i += 19) {
    for (int j = 0; j < 19; j++) {
        currentArray[j] = Byte.parseByte(splitData[i+j]);
    }
    publishProgress(currentArray);
}

我希望每次'i'循环执行时都会调用publishProgress。当发生这种情况时(由Logging数据验证),onProgressUpdate()中的代码无法正确执行(这很明显,因为只有在AsyncTask结束后才能看到updateGraph的结果。此外,结束图完全错误 - 形成(图表主要显示直线,但必须是曲线)。

如果整个代码直接在UI Thread上运行并且图形完美呈现,则不会发生这个奇怪的问题。在这种情况下,如您所知,UI会被阻止几秒钟。

我试过,而不是AsyncTask运行代码作为单独的线程,但相同的结果仍然存在。可以做任何变通办法吗?在这种情况下可以使用服务吗?

1 个答案:

答案 0 :(得分:0)

删除“super.onProgressUpdate(values);”后尝试来自你的代码

 @Override
    protected void onProgressUpdate(byte[]... values) {
        bb = ByteBuffer.allocate(20);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.put(values[0], 1, 18);
        ChannelOne.updateGraph(bb.getShort(0), bb.getShort(2), bb.getShort(4));
        ChannelTwo.updateGraph(bb.getShort(12), bb.getShort(14), bb.getShort(16));

    }