项目组要求我做一个安卓访问.net mvc后台的demo。倒腾了快一个星期,今天终于收尾了。得到了几个重要的经验:
1、由于安卓使用的是模拟器,所以,虽然程序和后台在同一个物理机器上运行,但是不能使用localhost访问后台。而iisexpress默认的只能使用localhost访问。发布到iis上的话,肯定能够成功,但是我没有发布成功。最后几经周折,发现只要配置一下iisexpress的配置文件就可以解决问题,可以让外网访问
点击这个配置文件
找到
<site name="WebSite1" id="1" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
</application>
<bindings>
<binding protocol="http" bindingInformation=":8080:localhost" />
</bindings>
</site>
其中name是你Web项目的名称,找到对应你项目的配置,然后在
<binding protocol="http" bindingInformation="*:8080:localhost" />
后面加上
<binding protocol="http" bindingInformation="*:8080:192.168.1.1" />
其中192.168.1.1改为你自己的Ip地址,8080改为你自己的端口,即可外网访问
参见博客http://blog.csdn.net/zhangjk1993/article/details/36671105
但是不知道为什么,我的vs始终没有在本机发布mvc应用程序到正式的iis7.5成功,只能在iisexpress上默认发布,再说吧,反正问题是解决了。
2、安卓的网络操作必须在多线程里面进行,查了查,原来是因为安卓设计者害怕网络会阻塞连接,所以才这样设计的。自己起一个多线程,就可以进行网络连接了。但是要操作ui,只能在主线程里面进行。
3、那么问题来了,网络连接获得消息后,总还是要在界面显示的,而界面操作只能在主线程中进行,那该如何?很简单,网上有很多的方法,我采用了控件.post的方式。参看代码:
// 操作ui智能在主线程,但是网络消息传输只能在多线程里面进行。最后采用了控件.post的方法在多线程里面操作ui
textView2.post(new Runnable() {
@Override
public void run() {
textView2.setText(jsonStr);
}
});
我想,从本质上来讲,它应该是向主线程发了消息,调用主线程的函数,来对控件进行设置的。
可以参见http://blog.sina.com.cn/s/blog_58b5cfcc0100khf3.html。这个博客里面谢了三种方法,还是第一种post的方法比较简单。而且尝试了第二种handler后,发现,网络连接无法进行。第三中没有尝试。