2015-06-07 39 views
0

我有下面的代碼:的TextView在線程錯誤

  new Thread(new Runnable(){ 
       public void run(){ 
        try { 
         pos = Calculo.Calcular(); 
         mostrarFrases(pos); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }).start(); 

其中mostrarFrases是:

void mostrarFrases(int pos){ 

    Mostrar = (TextView) findViewById(R.id.Texto); 
    Mostrar.setText(Frases[pos*2+1], 0, Frases[pos*2+1].length); 
} 

它的工作原理,如果我沒有任何線索,但沒有它不工作。我需要線程,因爲我需要等到Calculo.Calcular()完成它的工作。

回答

2

規則:你不能操縱UI線程之外的UI元素。

這裏是做事情的正確方法:

//Asuming that your activiy is named MainActivity 

     new Thread(new Runnable() { 
      public void run() { 
       try { 
        pos = Calculo.Calcular(); 
        //Manipulate your UI elements as following 
        MainActivity.this.runOnUiThread(new Runnable() { 
         public void run() { 
          mostrarFrases(pos); 
         } 
        }); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
+0

非常感謝你 – woske

1

您不應該在除主UI線程之外的任何線程上操作UI元素。

因此,在您的情況下,您有兩種選擇:使用runOnUIThread(Runnable)或使用AsyncTask並在onPostExecute()中執行UI操作。

我會去與AsyncTask - 它旨在用於這種情況。

1

UI操作必須在main/ui線程中完成。您有兩種選擇:

  • 您有一個對您的活動對象的引用。

    myActivity.runOnUiThread(...); 
    
  • 綁定一個處理程序,主線程和:

    // Main thread 
    Handler handler = new Handler(); 
    
    // Another thread 
    handler.post(new Runnable(){...}); 
    
2

不允許你觸及比UI線程以外的任何線程意見。

爲了解決這個問題,請嘗試以下操作:

void mostrarFrases(final int pos){ 

    runOnUiThread(new Runnable() { 
     public void run() { 
     Mostrar = (TextView) findViewById(R.id.Texto); 
     Mostrar.setText(Frases[pos*2+1], 0, Frases[pos*2+1].length); 
    }}); 
}