2017-11-03 10 views
1

私はAsyncTaskを使ってリストからグラフを描画しています。時にはそれは正常に動作し、グラフがレンダリングされます。しかし、場合によってはグラフがレンダリングされていないため、その理由はdoInBackground()メソッドがトリガーされていないためです。 AsyncTaskのコードは次のとおりです。AsyncTaskのdoInBackground()メソッドは時々だけ実行されます

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(); 
} 

代わり​​方法を用いて、私はまた、同じ結果をexecuteOnExecutor(THREAD_POOL_EXECUTOR)方法を用いて試みました。

+1

はdoInbackgroundにブレークポイントを適用する...それが毎回来るかどうかを確認するには、それが来れば、あなたの条件にエラーがブロック内に存在しているを実行するためのいずれかの条件がある場合、あなたはそれを呼び出す場所も確認してください。 –

+0

私はそのチェックの前にメソッドの最初の部分にログを置いて、それを確認しました。 doInBackground()は呼び出されません。 デバッグでも同じ結果が返されます。 doInBackgroundは時々呼び出されますが、時にはそうではありません。 –

+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メソッドが確実に実行されます。 doLBackground()内の条件をデバッグしてください。例えば、 "if(HistoryPlot.this.pcgPlayer!= null)" は、条件がうまくいかない可能性があり、xceptionをスローし、と呼ばれる。

+0

私はそのチェックの前にメソッドの最初にログを置いて、それを確認しました。 doInBackground()は呼び出されません。 –

0

このコードを複数回実行する場合は、onCreate関数を使用しないでください。必要なときにいつでも呼び出すことができるものを作成すると、onCreate()はアクティビティライフサイクルで1回だけ実行されます。それが原因かもしれません。

あなたが必要な場合は、同様のonCreateからそれを呼び出すことができます;)

0

次の2行に置き換え:コンテキストを渡す必要がありますあなたはいけない

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

:で

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

をここの活動の "これ"あなたがここでそれを必要としない活動の文脈を与えるので、上記の変更を適用してください。

OnCreateは、非同期タスクを実行し、いつでも新しいメソッドを呼び出す必要がある別のメソッドを作成するだけです。また、そのメソッドをonCreateでも呼び出すことができます。

+0

Broこれは、このことが、あなたがここでそれを呼び出すことになっているアクティビティのコンテキストに、新しいasynctaskを直接実行するだけのことです。 2行とそれに関連する変数を削除し、上で説明したように新しいタスクのシングルライナーを直接実行します。 –

+0

問題がある場合には、これがあなたの問題を解決するかどうか教えてください。あなたのために働く場合、答えとして私のポストをマークするのを忘れないでください。ハッピーコーディング:) –

+0

さらに、これは、あなたがもう一度呼び出す必要がない場合には、oncreateでのみ実行され、上で説明したように新しいコールを再度実行する必要があります。それはバックグラウンドスレッドに移動するので、完了したらonPostExecuteを実行し、必要な場合は必要に応じて新しいジョブを作成します。 –

関連する問題