我的问题是这样的:我要开发一个即时通讯的软件,大概像qq的聊天功能,大体思路是客户Client A将信息包装起来发给服务器,然后服务器根据A发过来的包解析出要传递给的目标者Client B,然后服务器继续将包发送给Client B,服务器接收功能我已经写好了,只是在B接收服务器时出现了一个小问题,我想让B使用ObjectInputStream不断地接收服务器发过来的信息,然后显示在B的一个对话Activity中的EditText中,但是我在这个对话Activity的onCreate方法中new一个ObjectInputStream,并让它执行readObject的话,模拟器在跳转到这个Activity时会黑屏,并显示失去响应。我想可能在onCreate方法中不能让ObjectInputStream执行readObject,于是把new ObjectInputStream和readObject放到按钮的点击事件处理中去,可这样的话就只能点击一次接收一次,不点击按钮就无法得到服务器发来的信息,各位大侠该怎么解决?
B的对话Activity代码如下
package cn.jiaoyuan.hmx;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class haoyouliaotian extends Activity {
Button bt_fasong;
EditText et_xiaoxi;
String daifadong;
ObjectOutputStream objout;
ObjectInputStream objin; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.zhidinghaoyouliaotian);
bt_fasong = (Button) findViewById(R.id.btn_fasong);
et_xiaoxi = (EditText) findViewById(R.id.et_daifadong);

bt_fasong.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
daifadong = et_xiaoxi.getText().toString();
YQMessage message = new YQMessage();
message.setContent(daifadong);
message.setType(YQMessageType.COM_MES);
message.setSender(MainActivity.myaccount);
message.setReceiver(haoyouliebiao.haoyouaccount);
try {
objout=new ObjectOutputStream(YQClient.s.getOutputStream());
objout.writeObject(message);
objin=new ObjectInputStream(YQClient.s.getInputStream());
YQMessage shouxino = (YQMessage) objin.readObject();
Toast.makeText(getApplicationContext(),
shouxino.getContent(), Toast.LENGTH_LONG).show(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}); }}

解决方案 »

  1.   

    你不能再主线程中做接受数据的,主线程应该只做UI和短时间的数据处理的,应该用handler处理返回数据的
      

  2.   

    不要在主线程中接收数据,try {
     objout=new ObjectOutputStream(YQClient.s.getOutputStream());
     objout.writeObject(message);
     objin=new ObjectInputStream(YQClient.s.getInputStream());
     YQMessage shouxino = (YQMessage) objin.readObject();
     Toast.makeText(getApplicationContext(),
     shouxino.getContent(), Toast.LENGTH_LONG).show();
     
    } catch (Exception e) {}然后通过handler发送给主线程刷新