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

ton*_*099 2 android ui-thread android-handler

在我的Activity中我使用了一个处理程序

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

我也有一个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);
  }
Run Code Online (Sandbox Code Playgroud)

我每30秒重复一次任务,最后在我的onCreate()里面创建一个线程然后传递给它 Runnable

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

这段代码android.os.NetworkOnMainThreadException甚至认为我正在开始一个新的线程并传递Runnable给它.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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Sim*_*ays 6

Handler.postDelayed()执行RunnableThread其中Handler创建.在您的情况下,您可以在UI线程上的Activity中创建它.所以第一次,Runnable获取在一个单独的Thread中执行,但第二次在UI Thread中执行.

  • 您可以引入另一个启动新线程的Runnable.`handler.postDelayed(new Runnable(){public void run(){new Thread(runnable).start();}},30000);` (4认同)