Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 一个奇怪的NetworkMainThreadException_Android_Multithreading_Exception_Xmpp_Smack - Fatal编程技术网

Android 一个奇怪的NetworkMainThreadException

Android 一个奇怪的NetworkMainThreadException,android,multithreading,exception,xmpp,smack,Android,Multithreading,Exception,Xmpp,Smack,据我们所知,我们不能在UI线程中执行web连接,并尝试在线程或AsyncTask上执行,我选择在可运行线程中运行web连接。当我点击按钮时,log会用connection.connect向我显示正确的代码;碰巧是NetworkMainThreadException,但是您知道,从下面的代码中,我已经在线程中编写了networkconnecton代码,所以,有人告诉我处理此问题的正确方法吗 public class MainActivity extends Activity { priv

据我们所知,我们不能在UI线程中执行web连接,并尝试在线程或AsyncTask上执行,我选择在可运行线程中运行web连接。当我点击按钮时,log会用connection.connect向我显示正确的代码;碰巧是NetworkMainThreadException,但是您知道,从下面的代码中,我已经在线程中编写了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();
            } // 

        }

    };

}

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

使用线程或异步任务

从DOSC中引用

每个处理程序实例都与一个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它被绑定到正在创建它的线程的线程/消息队列-从那时起,它将向该消息队列传递消息和可运行文件,并在它们从消息队列中出来时执行它们

如果在ui post honeycomb上运行与网络相关的操作,将获得NetworkOnMainThreadException

不要使用处理器。在UI主线程的情况下,它在绑定到的同一线程上运行。