子程序建立socket崩溃-安卓下建立socket就崩溃,分到子线程仍然不行,求助啊

问题描述

安卓下建立socket就崩溃,分到子线程仍然不行,求助啊

原代码如下,如果我不用BUTTON去触发的话是可以建立SOCKET的,但是用上BUTTON,把建立SOCKET的方法放到子线程中,仍然exception会显示不能再主线程中使用网络操作,真心求解为什么,看了2天了,刚学JAVA,不太理解。
package com.example.xlguang.wifi;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends ActionBarActivity {
private EditText editText;
private Button button;
private TextView MTextview;
Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.editText1);
button = (Button)findViewById(R.id.button1);
final RunnableThread runnable = new RunnableThread();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

        handler.post(runnable);
        }
    });

}

public class RunnableThread implements Runnable
{
public void run() {

        Socket socket = null;
          String message = editText.getText().toString()+ "rn" ;
        try {

            //创建客户端socket,注意:不能用localhost或127.0.0.1,Android模拟器把自己作为localhost
            socket = new Socket("172.16.5.30",8000);

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
                    (socket.getOutputStream())),true);
            //发送数据
               out.println(message);

            //接收数据
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String msg = in.readLine();
                        if (null != msg){
                            editText.setText(msg);
                            System.out.println(msg);
                        }
                        else{
                            editText.setText("data error");
                        }
             out.close();
              in.close();
        } catch (UnknownHostException e) {
               e.printStackTrace();
        }
        catch (IOException e) {
             e.printStackTrace();
        }
        finally{
            try {
                if (null != socket){
                    socket.close();
                }
            } catch (IOException e) {
                  e.printStackTrace();
            }
        }

}
}

解决方案

 handler.post(runnable);  //这是运行在UI线程中的,android会把runnable放到UI线程的消息循环中进行分支处理

所以改成

 new Thread(runnable).start();

解决方案二:

这个回答真的是太好了,解决了困扰我1天的问题。谢谢danielinbiti和楼主 !!必需留个声!建个新线程就OK啦!

时间: 2024-09-11 02:58:01

子程序建立socket崩溃-安卓下建立socket就崩溃,分到子线程仍然不行,求助啊的相关文章

安卓应用开发-socket开发 程序崩溃 logcat好奇怪

问题描述 socket开发 程序崩溃 logcat好奇怪 程序就崩溃在Socket s=new Socket(ip,port); 这句,我是用安卓做与pc通讯的客户端,崩溃前logcat如下 [getaddrinfo]: hostname=192.168.0.104; servname=(null); cache_mode=(null), netid=0; mark=0 [getaddrinfo]: ai_addrlen=0 ai_canonname=(null); ai_flags=4; ai

安卓wifi通信-建立一个基于安卓wifi的通信

问题描述 建立一个基于安卓wifi的通信 就是通过wifi连接2个手机,使一个手机发消息另一个手机能收到. 只要简单的wifi通讯就可以,各位大侠给点指导,不胜感激,O(∩_∩)O谢谢 !! 解决方案 其实不关wifi什么事,wifi只是提供一个网络环境而已.主要是用socket来实现,先用udp发广播,然后建立连接,再用socket进行通信,之前见过有人写了个demo,应该是在apkbus上的,我也忘了,你可以自己去找下. 解决方案二: 两个手机都连到某个AP上,用微信收发短消息即可.

PHP在WIN下操作socket

TCP/UDP Socket调试工具   PHP在WIN下操作socket最好用命令行运行程序,一般可以用于大文件的上传 要建立一个简单的服务,如果不考虑性能方面的问题,比如并发100 左右的服务,可以简单的用 Socket + Pcntl(linux).来实现 1.php加入环境变量,开启socket扩展 server端 Java代码   <?php   //确保在连接客户端时不会超时   set_time_limit(0);      $ip = '127.0.0.1';   $port =

unix下编写socket程序的一般步骤

在unix下写socket程序可能是最方便,你只要掌握其一般步骤,就可以松的写出面向传输层的应用. 1.理解几个常用的socket函数 #include #include int socket(int domain,int type,int portocol); domain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接

eclipse 安卓虚拟机建立好无响应

问题描述 eclipse 安卓虚拟机建立好无响应 ![ 如题我的虚拟机建立之后没有报错,环境变量应该都配置正确.启动完之后没有界面,但是任务管理器中有一个模拟器开着,但是没有出现虚拟机界面.单独从SDK文件夹下开启也是一样的效果,这个问题百度了好久就有一个人和我一样.但是没有解决,第一次提问.大神们帮帮我吧,刚学安卓,弄了两天了都没解决这个问题.操作系统环境win10 64位 解决方案 我终于解决这个问题了 是这样 更新SDK之后安卓的emulator的图标会显示缺省,我不知道这是不是一个系统b

eclipse的安卓虚拟机建立不了啊,,问题如下两张图,头疼死我了!

问题描述 eclipse的安卓虚拟机建立不了啊,,问题如下两张图,头疼死我了! 解决方案 解决方案二: target无法选择,,,我已经在sdk下了好几个API了,,eclipse也更新了 解决方案三: sdk下载是否正确,eclipse中sdk路径是否设置正确 解决方案四: 楼主用的是google提供的ide吧,当然不能.因为google是与某adt绑定在一起的.正确的是,从eclipse官网下载独立的eclipse,下载后再装adt,任何版本都适应. 解决方案五: SDK下载的不正确. 解决

Silverlight下的Socket通讯

http://www.cnblogs.com/chengxingliang/archive/2012/05/24/2515100.html 在Silverlight中进行通讯,只能使用4502-4534之间的端口进行数据传输,另外Silverlight客户端会自动向943端口的服务器端发送一个"<policy-file-request/>"的语句请求,然后服务器端943端口回发以下文件以许可Socket通讯. <?xml version="1.0"

openni opencv linux-如何在linux下建立一个着openni和opencv的工程?

问题描述 如何在linux下建立一个着openni和opencv的工程? 如何在linux下建立一个着openni和opencv的工程?麻烦大神们详细解说下,不胜感激!!!!

如何在Win9x/2k下建立共享目录

在Windows中建立一个共享目录,通常是使用NetShareAdd函数.但是在Win2k和Win9x下,这个函数分别是包含在Netapi32.dll和Svrapi.dll中. 那么如果直接在程序中使用Netapi32.lib或Svrapi.lib,在不同的操作系统下运行时会发生找不到xxx函数的输出错误. 解决的办法就是通过GetProcAddress动态获取NetShareAdd.正好ccrun在csdn回答一位网友的问题,顺便写了些代码,在这里贴出来. 注: 1. 以下代码已在Win2k