问题
I am making Android 4.4 project. I've got NetworkOnMainThreadException
.
Below is my process.
Service(sticky) -> Handler(per 5 minutes) -> Runnable -> HttpPost
Isn't Runnable a separate thread? Shoud I use AsyncTask in Runnable?
回答1:
Runnable is a simple interface, that, as per the Java documentation, "should be implemented by any class whose instances are intended to be executed by a thread." (Emphasis mine.)
For instance, defining a Runnable as follows will simply execute it in the same thread as it's created:
new Runnable() {
@Override
public void run() {
Log.d("Runnable", "Hello, world!");
}
}.run();
Observe that all you're actually doing here is creating a class and executing its public method run()
. There's no magic here that makes it run in a separate thread. Of course there isn't; Runnable is just an interface of three lines of code!
Compare this to implementing a Thread (which implements Runnable):
new Thread() {
@Override
public void run() {
Log.d("Runnable", "Hello, world!");
}
}.start();
The primary difference here is that Thread's start()
method takes care of the logic for spawning a new thread and executing the Runnable's run()
inside it.
Android's AsyncTask further facilitates thread execution and callbacks onto the main thread, but the concept is the same.
回答2:
Runnable
just per se is not a Thread
. You can use a Runnable
to be run inside a Thread
, but these are different concepts. You can use an AsyncTask
or just define a Thread
and use .start()
over it.
来源:https://stackoverflow.com/questions/22580354/networkonmainthreadexception-on-runnable