2017-08-09 24 views
-1

我寫了一個使用單線程工作正常的小程序,但我想通過單獨的線程調用圖形。如何添加多線程來顯示圖形以避免線程超載?

該圖形的調用來自按鈕按下。 (這工作正常)

  case R.id.button3: 
      draw = new Draw(this); 
      setContentView(draw); 
      break; 

如果我試圖包住該代碼是這樣的...

  Thread thread = new Thread(new Runnable(){ 
       @Override 
       public void run(){ 
        draw = new Draw(this); 
        setContentView(draw); 
       } 
      }); 
      thread.start(); 

我與(這)個問題。我不完全理解「這個」在做什麼,除了它指的是它所在的類。 答案簡單嗎? 我想這樣做,因爲我有以下消息「應用程序可能在其主線程上做了太多工作。」

謝謝

回答

0

Android在大多數情況下禁止從非UI線程修改UI。只有SurfaceView可以繪製異步。

而你的情況下,這個返回和Runnable的實例。試試。這個

+0

如果我這樣做,我得到以下「setContentView(draw);」錯誤「android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖」 –

+0

檢查我的答案plz –

0

我認爲你需要這個活動的上下文。

是指你在課堂上,你在呼喚在Thread類,所以這與線程關聯。

+0

您可能是正確的。在Draw類中有以下行:「public Draw(Context context)」。改成「draw = new draw Draw(Context context)」只是給了我另一個錯誤。 –

+0

如果你在一個活動,試試這個:「draw = new Draw(YourActivityName.this)」 –

+0

如果我這樣做,我會在「setContentView(draw);」上得到以下錯誤: 「android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖」 –

0

假設你的匿名類是封閉在一個類名Outer,那麼你可以這樣寫:

class Outer { 
    ... 
    ... someMethod(...) { 
     Thread thread = new Thread(new Runnable(){ 
      @Override 
      public void run(){ 
       draw = new Draw(Outer.this); // access enclosing instance 
       setContentView(draw); 
      } 
     }); 
     thread.start(); 
    } 
    ... 
} 

當心,你不應該異步畫...

+0

如果我這樣做,我會在「setContentView(draw);」上得到以下錯誤: 「android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖」 –

+0

對不起,如果我是愚蠢的,但我真的不明白這一點。 –