Android 4.4 プロジェクトを作成しています。私は持っていNetworkOnMainThreadException
ます。以下は私のプロセスです。
Service(sticky) -> Handler(per 5 minutes) -> Runnable -> HttpPost
Runnable は別のスレッドではありませんか? Runnable で AsyncTask を使用する必要がありますか?
Android 4.4 プロジェクトを作成しています。私は持っていNetworkOnMainThreadException
ます。以下は私のプロセスです。
Service(sticky) -> Handler(per 5 minutes) -> Runnable -> HttpPost
Runnable は別のスレッドではありませんか? Runnable で AsyncTask を使用する必要がありますか?
Runnable は単純なインターフェースであり、Java のドキュメントによると、「インスタンスがスレッドによって実行されることを意図している任意のクラスによって実装される必要があります」。(私のものを強調してください。)
たとえば、Runnable を次のように定義すると、作成されたのと同じスレッドで単純に実行されます。
new Runnable() {
@Override
public void run() {
Log.d("Runnable", "Hello, world!");
}
}.run();
ここで実際に行っていることは、クラスを作成し、そのパブリック メソッドを実行していることに注意してくださいrun()
。ここには、別のスレッドで実行する魔法はありません。もちろんありません。Runnable は、たった3 行のコードのインターフェースです。
これを Thread の実装 (Runnable を実装) と比較してください。
new Thread() {
@Override
public void run() {
Log.d("Runnable", "Hello, world!");
}
}.start();
ここでの主な違いは、Thread のstart()
メソッドが、新しいスレッドを生成し、その中で Runnable を実行するためのロジックを処理するrun()
ことです。
Android の AsyncTask は、スレッドの実行とメイン スレッドへのコールバックをさらに容易にしますが、概念は同じです。
Runnable
それだけではありませんThread
。を使用しRunnable
て 内で実行できますThread
が、これらは異なる概念です。を使用することも、AsyncTask
単に定義してそれThread
を使用することもできます.start()
。