一个奇怪的 NetWorkOnMainThreadException

Posted

技术标签:

【中文标题】一个奇怪的 NetWorkOnMainThreadException【英文标题】:One Strange NetWorkOnMainThreadException 【发布时间】:2013-09-28 17:43:59 【问题描述】:

据我们所知,我们无法在 UI 线程中执行 web 连接,并尝试在 Thread 或 AsyncTask 上执行,而我选择在可运行线程中运行 web 连接。当我单击按钮时,日志显示代码正确connection.connect(); 恰好是 NetworkOnMainThreadException,但是你知道,从我下面的代码中,我已经在线程中编写了我的 networkconnecton 代码,所以,任何人都告诉我正确的方法解决这个问题?

public class MainActivity extends Activity 

    private Button btn_send;
    private EditText et_content;


    private Connection connection;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_send = (Button) findViewById(R.id.bt_sendms);

        et_content = (EditText) findViewById(R.id.et_inputcontent);

        btn_send.setOnClickListener(onClicListener);

    

    public OnClickListener onClicListener = new OnClickListener() 

        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub

            handler.post(task);
        

    ;

    private Handler handler = new Handler();

    private Runnable task = new Runnable() 



        @Override
        public void run() 
            // TODO Auto-generated method stub

            XMPPConnection.DEBUG_ENABLED = true;

         ConnectionConfiguration connectionConfig = new ConnectionConfiguration(
                    "192.168.1.108", Integer.parseInt("5222"), "dell-PC");

            AccountManager accountManager;

            connectionConfig.setReconnectionAllowed(true);
            connectionConfig.setSendPresence(true);

            connection = new XMPPConnection(connectionConfig);

            try 

                connection.connect();
                accountManager = connection.getAccountManager(); // 
                connection.login("admin", "888889");
                ChatManager chatManager = connection.getChatManager();

                Chat newChat = chatManager.createChat("bryanwu@qq.com",
                        new MessageListener() 

                            @Override
                            public void processMessage(Chat chat,
                                    Message message) 

                            
                        );

                try 
                    newChat.sendMessage(et_content.getText().toString());
                 catch (XMPPException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                
                et_content.setText("");

             catch (XMPPException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             // 

        

    ;


【问题讨论】:

不要使用Handler。它在绑定到的同一线程上运行,在这种情况下是 UI 主线程。 developer.android.com/reference/android/os/Handler.html 【参考方案1】:

您在 ui 线程上创建一个处理程序。您在 runnable run 方法中运行与网络相关的操作。所以你在 ui 线程上运行网络相关的操作。

使用ThreadAsynctask

http://developer.android.com/reference/android/os/AsyncTask.html

引用自文档

每个 Handler 实例都与单个线程和该线程的消息队列相关联。 当您创建一个新的 Handler 时,它会绑定到创建它的线程的线程/消息队列——从那时起,它将向该消息队列传递消息和可运行对象,并在它们出来时执行它们消息队列。

如果你在 ui post honeycomb 上运行网络相关操作你会得到NetworkOnMainThreadException

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

【讨论】:

以上是关于一个奇怪的 NetWorkOnMainThreadException的主要内容,如果未能解决你的问题,请参考以下文章

有一个很奇怪的数学问题

对“asp.net core WebApi”的 ajax 调用返回一个奇怪/奇怪的值

请问一个关于MyEclipse注册码的奇怪的问题?

很奇怪,谁知道这是啥编码???

Qt一个很奇怪的问题求解答

一个奇怪的异常