2016-07-19 7 views
0

新しいスレッドでメインスレッドビューにアクセスすることはできないと思いました!別のスレッドからのメインスレッドビューへのアクセス

しかし、なぜ以下のコードが問題なく実行されるのですか?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textView = (TextView) findViewById(R.id.textView); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 

      try { 
       textView.append(InetAddress.getByName("192.168.1.252").getHostName() + "\n\n"); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 
} 
+0

はよろしいですか? プロジェクトをクリーンアップして再度実行し、結果をお知らせください。 –

+0

私はそれをやっています鋼の作品 –

答えて

1

はそれがhere現状で呼び出すことができます。たとえば

、下記の別のスレッドやディスプレイから 画像をダウンロードするクリックリスナーのためのいくつかのコードですImageViewの中で:それはネットワーク操作を処理 に新しいスレッドを作成しますので、まず

public void onClick(View v) { 
    new Thread(new Runnable() { 
     public void run() { 
      Bitmap b = loadImageFromNetwork("http://example.com/image.png"); 
      mImageView.setImageBitmap(b); 
     } 
    }).start(); 
} 

、これは、正常に動作するようです。ただし、 シングルスレッドモデルの第2のルールに違反しています。つまり、UIスレッド外の からAndroid UIツールキットにアクセスしません。このサンプルは、UIスレッドの代わりに ワーカースレッドからImageViewを変更します。これにより、定義されていない が発生し、予期しない動作が発生する可能性があります。これは、 の追跡が困難で時間がかかることがあります。

したがって、動作しますが推奨されません。 代わりにこれを行うには、いくつかの推奨される方法があります。

をこの問題を解決するには、Androidのは、他のスレッドからUI スレッドにアクセスするには、いくつかの方法を提供しています。ここでは助けることができる方法のリストは、次のとおりです。

Activity.runOnUiThread(Runnable) 
View.post(Runnable) 
View.postDelayed(Runnable, long) 
0

これを試してみてください。

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     textView = (TextView) findViewById(R.id.textView); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 

       try { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          textView.append(InetAddress.getByName("192.168.1.252").getHostName() + "\n\n"); 
         } 
        });     
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

runOnUiThread - 活動からの方法です。 。あなたはフラグメント内で作業している場合、あなたがgetActivityを()runOnUiThread

+1

それは質問への答えではありません。問題は、コードがなぜ機能するのかということでした。 – Bobby

関連する問題