AsyncTask中的doInBackground()方法有时只执行

时间:2017-11-03 09:20:01

标签: android android-asynctask

我正在使用AsyncTask从列表中呈现图表。有时它可以正常工作并且图形被渲染。但是在某些情况下,图形不会被渲染,原因是doInBackground()方法没有被触发。这是AsyncTask的代码。

private class HistoryPlotAsync extends AsyncTask<Void, Void, Void> {
    boolean isAnalysisMode = false;
    List<Byte> listECG;
    List<Byte> listHS;

    HistoryPlotAsync(List<Byte> listECG, List<Byte> listHS, List<Byte> listMur, boolean isAnalysisMode) {
        this.listECG = listECG;
        this.listHS = listHS;
        this.isAnalysisMode = isAnalysisMode;
        HistoryPlot.this.multiHsRenderer.setPanEnabled(false, false);
        HistoryPlot.this.multiEcgRenderer.setPanEnabled(false, false);
    }

    protected Void doInBackground(Void... params) {
        if (HistoryPlot.this.pcgPlayer != null) {
            HistoryPlot.this.pcgPlayer.start();
        } else {
            try {
                HistoryPlot.this.startSound();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }
        int i = 0;
        int loopCounter = 0;
        if (this.listHS != null && this.listHS.size() > 0) {
            loopCounter = this.listHS.size();
        }
        double xValue = 0.0d;
        double xValueEcg = 0.0d;
        do {
            xValueEcg += 0.0015625d;
            if (this.listHS != null && i % 2 == 0) {
                xValue += 0.0032012d;
                hsSeries.add(xValue,listHS.get((i/2)));
            }
            try {
                if (this.listECG != null && i < this.listECG.size()) {
                    ecgSeries.add(xValueEcg, listECG.get(i));
                }
            } catch (Exception e) {
                try {
                    Log.d("HistoryPlot -> ", "doInBackground: Exception " + e.getMessage());
                } catch (Exception e2) {
                    Log.e("HistoryPlot -> ", "Error in Analysis mode point conversion");
                }
            }
            if (i > HistoryPlot.this.refRange && i % 94 == 0) {
                HistoryPlot.this.xMin = HistoryPlot.this.xMin + 0.15d;
                HistoryPlot.this.xMax = HistoryPlot.this.xMax + 0.15d;
                HistoryPlot.this.multiHsRenderer.setXAxisMin(HistoryPlot.this.xMin);
                HistoryPlot.this.multiHsRenderer.setXAxisMax(HistoryPlot.this.xMax);
                HistoryPlot.this.multiEcgRenderer.setXAxisMin(HistoryPlot.this.xMin);
                HistoryPlot.this.multiEcgRenderer.setXAxisMax(HistoryPlot.this.xMax);
            }
            if (i % 16 == 0) {
                publishProgress(new Void[0]);
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            i++;
            if (i >= loopCounter) {
                break;
            }
        } while (!HistoryPlot.this.taskHistoryPlot.isCancelled());
        return null;
    }

    protected void onProgressUpdate(Void... values) {
        HistoryPlot.this.mHsChart.repaint();
        HistoryPlot.this.mEcgChart.repaint();
    }

    protected void onPostExecute(Void result) {
        HistoryPlot.this.stopSound();
        HistoryPlot.this.enableReplay();
        HistoryPlot.this.multiHsRenderer.setPanEnabled(true, true);
        HistoryPlot.this.multiEcgRenderer.setPanEnabled(true, true);
    }
}

AsyncTask通过活动的onCreate()方法中的以下代码执行。

protected void onCreate(Bundle savedInstance) {
...
this.taskHistoryPlot = new HistoryPlotAsync((List) mapData.get("fileEcg"), (List) mapData.get("fileHs"), (List) mapData.get("fileMur"), isAnalysisMode);
this.taskHistoryPlot.execute();
}

我没有使用execute()方法,而是尝试使用executeOnExecutor(THREAD_POOL_EXECUTOR)方法获得相同的结果。

4 个答案:

答案 0 :(得分:2)

我使用以下代码解决了问题。问题是我只是尝试使用execute()方法和executeOnExecutor()方法。您需要定义一个Executor和一个Blocking Queue变量,并为此定义池大小。

static int mCorePoolSize = 60;
static int mMaximumPoolSize = 80;
static int mKeepAliveTime = 10;

static BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(mMaximumPoolSize);
static Executor mCustomThreadPoolExecutor = new ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, mKeepAliveTime, TimeUnit.SECONDS, workQueue);

this.taskHistoryPlot = new HistoryPlotAsync((List) mapData.get("fileEcg"), (List) mapData.get("fileHs"), (List) mapData.get("fileMur"), isAnalysisMode);
this.taskHistoryPlot.executeOnExecutor(mCustomThreadPoolExecutor);

答案 1 :(得分:0)

如果您已经调用了这个类,那么确实会运行Asynctask方法。 请调试一下doInBackground()中的条件,例如 “if(HistoryPlot.this.pcgPlayer!= null)” 因为条件可能无法正常工作,或者抛出xception并导致函数未被调用。

答案 2 :(得分:0)

如果您希望多次执行该代码,请不要使用onCreate函数。创建一个可以随时调用的函数,onCreate()仅在Activity生命周期中运行一次。这可能是原因。

如果需要,您也可以从onCreate调用它;)

答案 3 :(得分:0)

替换这两行:

this.taskHistoryPlot = new HistoryPlotAsync((List) mapData.get("fileEcg"), (List) mapData.get("fileHs"), (List) mapData.get("fileMur"), isAnalysisMode);
this.taskHistoryPlot.execute();

使用:

new HistoryPlotAsync((List) mapData.get("fileEcg"), (List) mapData.get("fileHs"), (List) mapData.get("fileMur"), isAnalysisMode).execute();

你不需要在这里传递活动的背景&#34;这个。&#34;将给出你不需要它的活动的背景,所以应用上面提到的变化。

OnCreate将运行它一次只创建另一种方法,您需要在其中运行异步任务并在任何地方调用该新方法。您也可以在onCreate中调用该方法。