0

我正在制作 Android 4.4 项目。我有NetworkOnMainThreadException。下面是我的过程。

Service(sticky) -> Handler(per 5 minutes) -> Runnable -> HttpPost

Runnable 不是一个单独的线程吗?我应该在 Runnable 中使用 AsyncTask 吗?

4

2 回答 2

12

Runnable 是一个简单的接口,根据 Java 文档,“应该由其实例打算由线程执行的任何类实现”。(强调我的。)

例如,如下定义 Runnable 将简单地在创建它的线程中执行它:

new Runnable() {
    @Override
    public void run() {
        Log.d("Runnable", "Hello, world!");
    }
}.run();

请注意,您实际上在这里所做的只是创建一个类并执行其公共方法run()。这里没有什么魔法可以让它在一个单独的线程中运行。当然没有;Runnable 只是三行代码的一个接口

将此与实现 Thread(实现 Runnable)进行比较:

new Thread() {
    @Override
    public void run() {
        Log.d("Runnable", "Hello, world!");
    }
}.start();

这里的主要区别在于 Thread 的start()方法负责生成新线程并run()在其中执行 Runnable 的逻辑。

Android 的 AsyncTask 进一步促进了线程执行和回调到主线程,但概念是相同的。

于 2014-03-22T16:41:31.863 回答
4

Runnable只是本身不是一个Thread. 您可以使用 aRunnable在 a 中运行Thread,但这些是不同的概念。您可以使用 anAsyncTask或仅定义 aThread并使用.start()它。

于 2014-03-22T16:34:28.583 回答