关于Android socket失败问题和UI更新

来源:互联网 发布:js字符串比较相等 编辑:程序博客网 时间:2024/06/05 17:35

安卓4.0后不准在主线程(UI线程)上创建网络连接,

所以所以我们需要创建一个新的线程,把任务交给新线程处理,

但新线程不能操作UI,

我么可以用handler方法来解决UI的更新问题:
下面是是我百度地图连接服务器跟新UI的例子

Handler handler = new Handler() {  
   public void handleMessage(Message msg) {  
       // 要做的事情  
    updateInfo();
       super.handleMessage(msg);  
   }  
}; 

public void updateInfo() {
        try { 

            System.out.println("Client:Connecting");  
            //IP地址和端口号(对应服务端),
            Socket socket = new Socket("123.207.33.123", 1234);  
            //发送给服务端的消息                  
            String message = "GET\n";                    
            try {  
                System.out.println("Client Sending: '" + message );              
                //第二个参数为True则为自动flush  
                PrintWriter out = new PrintWriter(  
                         new BufferedWriter(new OutputStreamWriter(  
                                socket.getOutputStream())), true);  

// 开始发送信息
                out.println(message);  

//in为服务器返回的信息
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                
               //测试从服务器上是否能实时得到数据

 TextView TextView2=(TextView)findViewById(R.id.textView2); 
                String env_info =in.readLine();


                TextView2.setText(env_info);
               socket.close();  
            } catch (Exception e) {  
                e.printStackTrace();  
          
            } finally {  
           
            }  
        } catch (UnknownHostException e1) {  
            e1.printStackTrace();  
  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  


    }  


public class MyThread implements Runnable {  
   @Override  
   public void run() {  
       while (true) {  
           try {   
               Message message = new Message();  
               message.what = 1;  
               handler.sendMessage(message);// 发送消息  跟新UI
               Thread.sleep(3000);// 线程暂停3秒,单位毫秒 
           } catch (InterruptedException e) {  
        
               e.printStackTrace();  
           }  
       }  
   }  
}  

    @Override
    public void onCreate(Bundle savedInstanceState) {
   
        MapView.setMapCustomEnable(true);
        super.onCreate(savedInstanceState);

//开启线程

 new Thread(new MyThread()).start();

}

原创粉丝点击