Android 聊天软件开发

来源:互联网 发布:virtualbox mac怎么用 编辑:程序博客网 时间:2024/04/27 15:00

最近在做Android的课程设计,平时上课也没有怎么听老师讲课,弄了两周时间,终于在前辈的基础上做出了一点东西。谢谢那位在http://51cto.com/分享的源码。这份源码功能基本实现,很适合新手学习使用,整体架构也是用MVC来写的。现在Android已经出到5了。。。这份源码还是支持2.3左右的,有些地方需要重写。

1:google被墙,怎么更新sdk(工欲善其事,必先利其器)。

1:方法一:在国内某些网站上先下载后(可能也是比较旧的版本),再手动安装。推荐一个网站,http://android-sdk.softonic.cn/感觉还可以。由于当时自己没有使用,就不做具体的介绍了。,
2:方法二:直接使用Google的源更新。这里是具体的步骤。http://jingyan.baidu.com/article/b0b63dbfd0948c4a483070ea.html这里再加一点说明。host文件请使用记事本管理员权限打开,我当时使用的IP地址如下(速度挺快的)。


3:使用vpn(goagent)翻墙。。。嘿嘿,可以当我没有说。个人觉得作为一名程序猿,翻墙这种东西很简单的。

2:实际开发中的问题

主要问题是碰到了:android.os.NetworkOnMainThreadException。课题老师说是因为在Android4.0后,不能再ui主线程里面开启网络连接。要在主线程下面开启一个网络连接的子线程。

实际的解决方案,是在UI主线程下另外开启一个子线程,在子线程里面运行网络连接的程序。实际的工作代码如下:


protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);this.setContentView(R.layout.activity_register);findViewById(R.id.rigister_btn_register).setOnClickListener(new OnClickListener(){public void onClick(View arg0) {new Thread(runnable).start();}});}Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        Bundle data = msg.getData();        String val = data.getString("value");        Log.i("mylog","请求结果为-->" + val);        int a=Integer.parseInt(val);        if(a==1){//注册成功跳转到登陆Toast.makeText(RegisterActivity.this, "恭喜你,注册成功 !", Toast.LENGTH_SHORT).show();startActivity(new Intent(RegisterActivity.this,LoginActivity.class));}    }};Runnable runnable = new Runnable(){    public void run() {        //        // TODO: http request.        //        //简单写了下,获取注册信息,账号EditText accountEt=(EditText) findViewById(R.id.register_account);Log.v("test", accountEt.toString());//密码EditText passwordEt=(EditText) findViewById(R.id.register_password);Log.v("test", passwordEt.toString());//获得账号EditText nickEt=(EditText) findViewById(R.id.register_nick);//获得性别RadioGroup group = (RadioGroup)findViewById(R.id.register_radiogroup);group.setOnCheckedChangeListener(new OnCheckedChangeListener() {public void onCheckedChanged(RadioGroup arg0,int id) {if(id==R.id.register_radio_nv){sex="女";}}});//内容为空if(accountEt.getText().equals("") || passwordEt.getText().equals("")){Toast.makeText(RegisterActivity.this, "账号或密码不能为空!", Toast.LENGTH_SHORT).show();}else {//实例化user类,将表单信息填充到user中User user=new User();user.setAccount(Integer.parseInt(accountEt.getText().toString()));user.setPassword(passwordEt.getText().toString());user.setNick(nickEt.getText().toString());user.setTrends("该用户暂时没有动态");user.setSex(sex);user.setAvatar(4);user.setLev(0);user.setAge(0);//设置时间user.setTime(MyTime.geTimeNoS());user.setOperation("register");    int b=0;try {Socket s=new Socket();try{s.connect(new InetSocketAddress("10.1.12.216",10000),2000);}catch(SocketTimeoutException e){//连接服务器超时,错误2b=2;}ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());oos.writeObject(user);//写入用户信息Log.i("mylog","请求数据为-->" + user);ObjectInputStream ois=new ObjectInputStream(s.getInputStream());Log.i("mylog","返回结果为-->" + ois.read());YQMessage ms=(YQMessage)ois.readObject();if(ms.getType().equals(YQMessageType.SUCCESS)){//连接服务器成功1b=1;}else if(ms.getType().equals(YQMessageType.FAIL)){//连接服务器超时,错误3b=3;}} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}        Message msg = new Message();        Bundle data = new Bundle();        data.putString("value",String.valueOf(b));        msg.setData(data);        handler.sendMessage(msg);    }   }};



0 0
原创粉丝点击