2017-08-09 9 views
-1

私は単一のスレッドを使ってうまく動作する小さなプログラムを書いていますが、私は別のスレッドを介してグラフィックを呼びたいと思います。スレッドのオーバーロードを避けるために、グラフィックを表示するマルチスレッドを追加するにはどうすればよいですか?

グラフィックの呼び出しは、ボタンを押すことによって行われます。私はこのようなこのコードを包むしようとすると...

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

私は(この)の問題を取得

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

(これは正常に動作します)。私は、 "this"が何をしているかを、それがそのクラス内にあるクラスを参照する以外は完全に理解していません。 答えは簡単ですか? 私は次のようなメッセージが表示されているので、これを実行しようとしています。「アプリケーションがメインスレッドで作業している可能性があります。

ありがとうございました

答えて

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

申し訳ありませんが、私がばかだと申し訳ありませんが、私は本当にこれを理解していません。 –

関連する問題