在线咨询
微信咨询
服务热线
服务热线:15639912513
TOP
当前位置:
首页 > 新闻中心> 安卓课堂>Android联网必须在子线程中操作以及消…

Android联网必须在子线程中操作以及消息机制的写法

发布时间:2019-11-26 浏览:3857次

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方法中 接受消息 更新界面


TAG
3857
该内容对我有帮助