android - 我在使用单独的线程时得到 `android.os.NetworkOnMainThreadException`

标签 android ui-thread android-handler

在我的 Activity 中,我使用处理程序

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg)  {   
               //do GUI stuff, edit views, etc..
    }
};

我还有一个 Runnable,它发送到 php 并等待 json 响应

Runnable runnable3 = new Runnable() {
        public void run() { 
            JSONParserArray jsonParserRun = new JSONParserArray();
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("p1", "myParam1"));
            try {
                String link = "http://mylink.com/someFileOnServer.php";
                JSONArray jArray = jsonParserRun.makeHttpRequest(link , "POST",
                        params);
                if (jArray != null && jArray.length() != 0) {
                } else {
                    //either null (because of throwing exception) or empty
                }
            } catch (Exception e) {
            }
        }
        handler.sendEmptyMessage(0);
        handler.postDelayed(runnable, 30000);
  }

我每 30 秒重复一次该任务,最后在 onCreate() 中创建一个线程并向其传递 Runnable

@Override
public void onCreate(Bundle savedInstanceState) {
            //other stuff
    Thread t = new Thread(runnable3);
    t.start();
}

即使我认为我正在启动一个新线程并将Runnable传递给它,此代码也会抛出android.os.NetworkOnMainThreadException。 JSONParserArray 类在其他情况下工作正常(所以不用担心)

但是,当我在 Runnable 中运行此方法时,它工作正常。

private boolean hasActiveInternetConnection() {
        try {
            new Socket().connect(new InetSocketAddress("google.com", 80), 3000);    
            return true;
        } catch (Exception e) {
            Log.i("tag", e.toString());
            return false;
        }
    }

最佳答案

Handler.postDelayed() 在创建 HandlerThread 中执行 Runnable。在您的情况下,您在 UI 线程上的 Activity 中创建它。因此,第一次,Runnable 在单独的线程中执行,但第二次在 UI 线程中执行。

关于android - 我在使用单独的线程时得到 `android.os.NetworkOnMainThreadException`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033771/

相关文章:

android - Facebook 应用测试人员未收到通知

android - OnItemClickListener 从模型中获取数据

c# - 举行事件触发了两次Windows Phone 8.1

mvvm - Xamarin 表单 : Should ObservableCollection always be set/updated in the UI thread?

android - 使用UI-Thread更新ImageView的位图

android - 运行简单后台任务的最简洁方法?

android - 在列表行中动态添加更多卡片 android TV leanback

android - 当更新来自后台线程时如何处理进度条状态

android - 避免在运行时异常的情况下使处理程序线程崩溃?

java - Android:显示带有时间延迟的数组元素?