2
new Thread(new Runnable(){

}).run();

vs

new AsyncTask().execute();

私はそれらが同じものであるという印象を受けました、両方とも新しいワーカースレッドを開始しますが、そうではありませんか?

私が尋ねる理由は、を使用して何らかのネットワーク接続を行おうとするとnew Thread()、が取得NetworkOnMainThreadExceptionされますが、同じコードを非同期タスクに配置すると、それが取得されないためです。

また、この違いの別の例は、すべてのプロット/表示/非表示を実行する必要があるgoogle Maps api v2main threadを使用することですが、マーカーを非表示/表示するために使用new Thread()すると、正常に表示されますが、非同期タスクで表示/非表示にしようとすると、メインスレッドで実行する必要があるという例外が発生します。

new Thread()本当にワーカースレッドを開始しませんか?

編集

提供されたリンクが私の質問を読んで答えなかったので、なぜこれが閉じられたのかわからず、私の質問に答えるrun()vsの使用については何も言及していませんstart()

4

3 に答える 3

6

start()の代わりにrun()を呼び出すと、呼び出されたスレッドで実行されます。start()を呼び出すと、新しいスレッドが作成されます。.run()を呼び出すため、エラーが発生するのはそのためです。

于 2013-03-16T15:53:53.143 に答える
0

基本的に両方とも同等ですがAsyncTask、GUIとの統合という点では、Androidではよりシンプルで優れたアプローチです。

AsyncTaskこの方法でサーバーからデータをダウンロードしdoInBackground()、でGUIを更新できる場合postExecute()

AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、バックグラウンド操作を実行してUIスレッドで結果を公開できます。

于 2013-03-16T15:50:29.183 に答える
0

メインUIスレッドでネットワーク呼び出しを行っているため、NetworkOnMainThreadException例外が発生します。

AsyncTaskを使用すると、その例外を取り除くことができます。ドキュメントから、AsyncTasksは理想的には短い操作(最大で数秒)に使用する必要があります。スレッドを長期間実行し続ける必要がある場合は、java.util.concurrentが提供するさまざまなAPIを使用することを強くお勧めします。 Executor、ThreadPoolExecutor、FutureTaskなどのパッケージ。

http://developer.android.com/reference/android/os/AsyncTask.html

http://android-developers.blogspot.in/2009/05/painless-threading.html。リンクの記事には、このトピックに関する適切な説明があります。

AsyncTaskの代わりにRoboSpiceがあります。https://github.com/octo-online/robospice

于 2013-03-16T16:03:49.670 に答える