Android 聊天软件开发

最近在做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){
					//连接服务器超时,错误2
					b=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)){
					//连接服务器成功1
					b=1;
				}else if(ms.getType().equals(YQMessageType.FAIL)){
					//连接服务器超时,错误3
					b=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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值