2014-03-28 126 views
0

對不起大家這已被問了幾次,但我只是不明白任何答案,因爲大多數是關於定時UI更新。所以我有一個backgroundTasks線程時我的應用程序第一次啓動時調用(有沒有網絡連接so..I認爲這是你如何做到這一點?)Android線程說明?

public class MainActivity extends ActionBarActivity { 
     String data[][]; 
     int arrayPosition = 0; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     runBackgroundTask(); 

    } 

這裏是我的線程..

public void runBackgroundTask(){ 
      new Thread(new Runnable() { 
       public void run() { 
        data = pullSchedule(data); 
        updateUI(data,arrayPosition); 
       } 
      }).start(); 
     } 

它所做的就是調用一個方法pullSchedule,它使用webcrawler更新2D數組。所以我的問題出現在我調用updateUI方法的時候,這個方法也被兩個按鈕用來循環處理完美的數組數據。只是當線程第一次運行,如果我嘗試更新UI,我得到一個錯誤。

public void upDateUI(String data[][], int arrayPosition){ 
     TextView gameTime =(TextView)findViewById(R.id.txtDate); 
     //more but deleted to save space :) 
    } 

我研究了爲什麼我無法從後臺線程更新UI,但我不明白如何解決這個問題?我想將整個方法放入runOnUiThread(new Runnable(),但後來我認爲我的數據和arrayPosition必須由於內部類而被聲明爲最終的。第一個Android應用程序剛剛丟失。謝謝你的幫助。

+0

你看過AsyncTask嗎?它有一個名爲onPostExecute的回調方法,它允許您在後臺進程完成後更新UI。 http://developer.android.com/reference/android/os/AsyncTask.html – RichS

+0

你可以在UI線程中創建'Handler'並在線程中使用'Handler.post(Runnable r)'。但最好的方法是使用AsyncTask – rdbmsa

回答

0

您可以使用asyntask這從中可以更新UI

public myAsyn extends AsyncTask<Void,Void,Void> 
{ 
    @Override 
     protected String doInBackground(Void... params) { 
     data = pullSchedule(data); 
       return null;  
     } 

     @Override 
     protected void onPostExecute(String result) { 
      updateUI(data,arrayPosition); 
     } 
} 

doInBackground在單獨的線程運行,而onPostExecute在UI線程運行,因此你可以從那裏更新UI。

+0

謝謝我將不得不看看AsycTask – Timeflies

+0

我有這樣的設置,它是說我沒有使用onPost執行?抱歉不知道如何格式化評論! @wqrahd '公共類myAsyn延伸的AsyncTask <空隙,空隙,空隙率> { @覆蓋 保護無效doInBackground(空隙... PARAMS){ 數據= pullSchedule(); 返回null; } 保護無效onPostExecute(字符串結果){ upDateUI(data,arrayPosition); } }' – Timeflies

+0

只是複製並粘貼我的答案 –

0

你在正確的軌道上。你的應用崩潰的原因是因爲你試圖從UI線程更新UI元素。爲避免這種情況,您可以按照RichS建議的方式進行操作,並使用在UI線程上執行onPostExecute()的AsyncTask,或在後臺線程中使用runOnUiThread(new Runnable() {...環繞您的​​updateUI()調用。