Android联网必须在子线程中操作。
为波密等地区用户提供了全套网页设计制作服务,及波密网站建设行业解决方案。主营业务为成都网站设计、网站制作、波密网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
子线程不能修改UI,修改UI必须在主线程。
主线程又叫UI线程。
以下代码是在郑州app开发Android编写页面代码查看器的时候出现的代码。其中关于Android联网必须在子线程中操作,子线程不能修改UI,修改UI必须在主线程。这些都体现在MyonClicklistener这个方法里面了。
protected void onCreate(bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_url = (EditText) findViewbyId(R.id.et_url);
btn_show = (button) findViewbyId(R.id.btn_show);
tv_code = (TextView) findViewbyId(R.id.tv_code);
et_url.setText("http://10.0.2.2:8080");
btn_show.setOnClickListener(new MyonClicklistener());
String name = Thread.currentThread().getName();
Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
}
private class MyonClicklistener implements OnClickListener{
@Override
public void onClick(View v) {
new Thread(){
public void run() {
//获取url
String path = et_url.getText().toString().trim();
try {
URL url = new URL(path);
//拿着url联网
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置请求的方法 方法要大写 默认采用的GET方式请求
connection.setRequestMethod("GET");
//设置连接超时的时间
connection.setConnectTimeout(10000);
//获取响应码
int code = connection.getResponseCode();
//判断响应码 如果是200
if(code==200){
//联网后获取响应内容
//通过textview 展示对应的内容
InputStream inputStream = connection.getInputStream();
String result = Utils.getStringFromStream(inputStream);
//不能直接修改界面 而是要通知主线程 获取到了数据 并且把数据丢给主线程 在主线程中显示
//②通过handler发送消息 Message 把要更新界面用到的数据 通过Message 携带数据
Message msg = new Message();
msg.what = 1;
msg.obj = result;
handler.sendMessage(msg);
//修改textview内容展示数据
//tv_code.setText(result);
}
} catch (Exception e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
//这里的代码一定会执行在主线程中
Toast.makeText(MainActivity.this, "网络连接异常", Toast.LENGTH_SHORT).show();
}
});
}
};
}.start();
}
}
总结下,消息机制的写法,如下几个步骤。
①在主线程中创建一个Handler对象 并且重写handleMessage方法
②在子线程需要更新UI的地方 通过handler发送消息
2.1创建一个message
2.2如果有数据需要携带 通过message.obj携带数据
2.3通过handler的sendMessage方法 发送消息
③在handlerMessage方法中 接受消息 更新界面