2015-08-28 100 views
-2
public class MainActivity extends Activity 
{ 

private EditText txtLoginName; 
private EditText txtLoginPassword; 
private Button btnLogin; 
private Button btnReset; 

private static final int FLAG_LOGIN_SUCCESS=1; 
private static final String MSG_LOGIN_ERROR="登录出错"; 
private static final String MSG_LOGIN_SUCCESS="登录成功"; 
private static ProgressDialog dialog; 

public static final String MSG_LOGIN_FAILED="登录名或密码出错"; 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //初始化控件 
    init(); 

    //点击登录,响应事件 
    this.btnLogin.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
      final String loginName=txtLoginName.getText().toString(); 
      final String loginPassword=txtLoginPassword.getText().toString(); 

      Toast.makeText(v.getContext(), loginName, Toast.LENGTH_SHORT).show(); 

      Toast.makeText(v.getContext(), loginPassword, Toast.LENGTH_SHORT).show(); 

      if(dialog==null) 
      { 
       dialog=new ProgressDialog(MainActivity.this); 
      } 
      dialog.setTitle("请等待"); 
      dialog.setMessage("登录中..."); 
      dialog.setCancelable(false); 
      dialog.show(); 

      MyRunnable mRunnable=new MyRunnable(loginName,loginPassword); 

      Thread thread=new Thread(mRunnable); 

      thread.start(); 
     } 
    }); 

    //点击重置,响应事件 
    this.btnReset.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      txtLoginName.setText(""); 
      txtLoginPassword.setText(""); 

     } 
    }); 

} 
private static class IHandler extends Handler 
{ 
    private final WeakReference<Activity> mActivity; 

    public IHandler(MainActivity activity) 
    { 
     mActivity=new WeakReference<Activity>(activity); 
    } 
    @Override 
    public void handleMessage(Message msg) 
    { 
     if(dialog!=null) 
     { 
      dialog.dismiss(); 
     } 
     int flag=msg.what; 
     switch (flag) { 
     case 0: 
      String errorMsg=(String)msg.getData().getString("ErrorMsg"); 
      ((MainActivity)mActivity.get()).showTip(errorMsg); 
      break; 
     case FLAG_LOGIN_SUCCESS: 
      ((MainActivity)mActivity.get()).showTip(MSG_LOGIN_SUCCESS); 
     default: 
      break; 
     } 
    } 
} 

private void showTip(String str) 
{ 
    Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); 
} 

private IHandler handler=new IHandler(this); 
private void init() 
{ 
    this.txtLoginName=(EditText) findViewById(R.id.editText1); 
     this.txtLoginPassword=(EditText) findViewById(R.id.editText2); 
     this.btnLogin=(Button) findViewById(R.id.button1); 
     this.btnReset=(Button) findViewById(R.id.button2); 
} 
class MyRunnable implements Runnable 
{ 

    private ObjectInputStream readObject; 
    private ObjectOutputStream writeObject; 
    private Socket socket; 
    private ReturnMessage returnMessage; 
    private String loginName; 
    private String loginPassword; 
    LoginMessage msg; 

    public MyRunnable(String loginName,String loginPassword) 
    { 
     this.loginName=loginName; 
     this.loginPassword=loginPassword; 
    } 
    @Override 
    public void run() 
    { 
     try 
     { 
      //userService.userLogin(loginName, loginPassword); 
      socket = new Socket("192.168.1.114", 8000); 
      writeObject = getOutObjectStream(socket); 
      readObject = getInObjectStream(socket); 
      msg=new LoginMessage(loginName, loginPassword); 
      writeObject.writeObject(msg); 
      writeObject.flush(); 
      returnMessage =(ReturnMessage)readObject.readObject(); 
      Log.d("hehehehe", returnMessage.getStr()); 
      socket.close(); 
      handler.sendEmptyMessage(FLAG_LOGIN_SUCCESS); 
     } 
     catch(SecurityException e) 
     { 
      /*e.printStackTrace();*/ 
      Message msg=new Message(); 
      Bundle data=new Bundle(); 
      data.putSerializable("ErrorMsg", "1"); 
      msg.setData(data); 
      handler.sendMessage(msg); 
     } 
     catch(Exception e) 
     { 
      /*e.printStackTrace();*/ 
      Message msg=new Message(); 
      Bundle data=new Bundle(); 
      data.putSerializable("ErrorMsg","2"); 
      msg.setData(data); 
      handler.sendMessage(msg); 
     } 
    } 
    private ObjectOutputStream getOutObjectStream(Socket socket) throws IOException 
    { 
    return new ObjectOutputStream(socket.getOutputStream()); 
    } 
    private ObjectInputStream getInObjectStream(Socket socket) throws IOException 
    { 
    BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); 
    return new ObjectInputStream(bis); 
    } 
} 
} 

这是一个简单的登录服务器程序,运行它可以发送消息到服务器,但它不能接收来自服务器的消息,有时会崩溃,谁能帮助我?为什么我无法接收来自服务器的消息?

+1

它在哪里崩溃'有时'? – Abhi

+1

这是一段代码。请仅发布相关部分,并确保其正确缩进。 – e4c5

+0

当我第一次运行程序时,它崩溃了,但只是这样几次,我不知道发生了什么事,而且我也无法接收来自服务器的消息 –

回答

0

您已经在类范围内实例化了一个对象,并将this传递给它的构造函数。

private IHandler handler = new IHandler(this); 

你应该避免这种情况,因为对象this尚未仍然初始化。所以你可能想在一个Activity的方法中实例化你的处理程序(例如,onCreate方法)。

相关问题