2012-09-16 20 views
2

我的問題在一個簡短的描述: 我的主線程從活動延伸。它啓動兩個異步任務,從不同的UDP源收集數據。其中一項任務應該將數據附加到一個graphdrawing類(http://www.jjoe64.com/p/graphview-library.html)。我從AsynTask的onPostExecute科UI進行更新:AsyncTask應自動更新圖形

@Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     edt2.setText(Integer.toString(result)); 
     // Graph Update 
     if (graphActive) { 
      exampleSeries1.appendData(ATList.get(ATList.size()-1), true); 
     } else { 
      //do nothing 
     } 
    } 

的數據傳遞到圖形,如果我與我的屏幕上手指點擊,則顯示正常,但我希望軟件自動更新圖形。 edt2文本字段會自動更新。 我嘗試以下操作:

layout.postInvalidate(); //and invalidate 

我hvae不知道如何使Android更新graphview。這是XML的各個部分:

<LinearLayout 
          xmlns:android="http://schemas.android.com/apk/res/android" 
          android:id="@+id/graph1" 
          android:layout_width="match_parent" 
          android:layout_height="305dp" > 

         </LinearLayout> 

非常感謝您的幫助!

+0

LinearLayout是你繪製圖形的地方嗎? – weakwire

+0

是的,這是正確的 – user1675604

+0

考慮使其成爲一個視圖或只是添加一個虛擬視圖到LinearLayout看它是否工作。沒有可繪製和沒有孩子的ViewGroup往往不會失效。請發佈您的結果 – weakwire

回答

0

AsyncTask不是一個Ui線程使用runOnUiThread(..)代替Asynctask。

1 rl-:父視圖。 2 MyView的 - :兒童瀏覽

//使用這個方法//

runOnUiThread(new Runnable() { 

     //@Override 
     public void run() { 
      // TODO Auto-generated method stub 
      rl.addView(new myView(getApplicationContext())); 
     } 
    }); 
+0

但它應該在後臺運行,而不是在UI線程中,還是沒有明確指出? – user1675604

+0

你只能使用AsyncTask來更新數據,而不是使用ui,因爲asynctask不是ui線程。所以只在後臺保存更新數據,然後使用ruOnUiThread()傳遞給ui線程來更新圖形 – yokees

2

通過Risbah答案是不正確的。在UI線程上調用OnPostExecture和OnProgressUpdate。接受的解決方案比您在OnPostExecute中更新的原始軌道更具線索性。這樣做絕對是一種優雅的方式。你不想在這裏調用runOnUIThread。正如weakwire所說,使圖形無效是正確的方式,而不是使佈局無效。無論如何,接受的答案不是Android在後臺執行任務的方式,然後用結果更新UI。