Android通信:Handler和runOnUiThread()
来源:互联网 发布:床边故事专辑知乎 编辑:程序博客网 时间:2024/06/16 14:18
1、Handler类,主要用于复杂的通信,但操作相对复杂
public class MainActivity extends Activity {private static final int SET_TEXT = 1;private static final int ERROR = 2;private EditText metPath, metShow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setListener();}Handler handler = new Handler() {public void handleMessage(Message msg) {String result = (String) msg.obj;switch (msg.what) {case SET_TEXT:metShow.setText(result);break;case ERROR:Toast.makeText(MainActivity.this, "操作失败", Toast.LENGTH_LONG).show();break;}};};private void setListener() {findViewById(R.id.btnComfire).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new ChildThread().start();}});}private void initView() {metPath = (EditText) findViewById(R.id.evPath);metShow = (EditText) findViewById(R.id.etShow);}/** * 连接网络属于耗时操作,放到子线程中进行相应操作 * @author CHJ * */class ChildThread extends Thread {public void run() {String path = metPath.getText().toString().trim();try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置请求参数, 这里为了简单只设置两种conn.setRequestMethod("GET");conn.setConnectTimeout(5000);int code = conn.getResponseCode();if (200 == code) {// 建立连接成功// 获取网页源代码并且转换成字符串InputStream is = conn.getInputStream();String result = new UtilTools().streamToString(is);if (result == null) {new UtilTools().sendInfoToMainThread(handler, ERROR,null);} else {new UtilTools().sendInfoToMainThread(handler, SET_TEXT,result);}} else {new UtilTools().sendInfoToMainThread(handler, ERROR, null);}} catch (Exception e) {e.printStackTrace();new UtilTools().sendInfoToMainThread(handler, ERROR, null);}};}}class UtilTools {/** * 将一个输出流转换成字符串 * @param is * @return 字符串 */public String streamToString(InputStream is) {// 在这个方法中还可以处理乱码,这里就不操作了。思路是通过解析// 网页的源码,可以得到网页的编码格式,然后进行相应操作BufferedReader br = new BufferedReader(new InputStreamReader(is));StringBuilder sb = new StringBuilder();String result = null;try {String temp = null;while ((temp = br.readLine()) != null) {sb.append(temp);}result = sb.toString().trim();is.close();return result;} catch (Exception e) {e.printStackTrace();try {is.close();} catch (IOException e1) {e1.printStackTrace();}return null;}}/** * 往主线程发送消息,这里主要是考虑代码的复用 * @param handler */public void sendInfoToMainThread(Handler handler, int tag, String obj) {Message msg = new Message();msg.what = tag;msg.obj = obj;handler.sendMessage(msg);}}
2、runOnUiThread()主要用于简单的通信,操作简单。
runOnUiThread(new Runnable() {
public void run() {
// 操作主线程的UI
}
});
public class MainActivity extends Activity {private EditText metPath, metShow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setListener();}private void setListener() {findViewById(R.id.btnComfire).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new Thread() {public void run() {String path = metPath.getText().toString().trim();try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置请求参数, 这里为了简单只设置两种conn.setRequestMethod("GET");conn.setConnectTimeout(5000);int code = conn.getResponseCode();if (200 == code) {// 建立连接成功// 获取网页源代码并且转换成字符串InputStream is = conn.getInputStream();final String result = new UtilTools().streamToString(is);if (result == null) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,"操作失败", Toast.LENGTH_LONG).show();}});} else {runOnUiThread(new Runnable() {public void run() {metShow.setText(result);}});}} else {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,"操作失败", Toast.LENGTH_LONG).show();}});}} catch (Exception e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,"操作失败", Toast.LENGTH_LONG).show();}});}};}.start();}});}private void initView() {metPath = (EditText) findViewById(R.id.evPath);metShow = (EditText) findViewById(R.id.etShow);}}class UtilTools {/** * 将一个输出流转换成字符串 * * @param is * @return 字符串 */public String streamToString(InputStream is) {// 在这个方法中还可以处理乱码,这里就不操作了。思路是通过解析// 网页的源码,可以得到网页的编码格式,然后进行相应操作BufferedReader br = new BufferedReader(new InputStreamReader(is));StringBuilder sb = new StringBuilder();String result = null;try {String temp = null;while ((temp = br.readLine()) != null) {sb.append(temp);}result = sb.toString().trim();is.close();return result;} catch (Exception e) {e.printStackTrace();try {is.close();} catch (IOException e1) {e1.printStackTrace();}return null;}}}
0 0
- Android通信:Handler和runOnUiThread()
- Android Activity.runOnUiThread() 和 Handler
- android 更新界面视图 Handler和runOnUiThread
- android 更新界面视图 Handler和runOnUiThread
- AsyncTask和Handler和runOnUiThread()
- Handler、Message 和 Activity.runOnUiThread()
- android runOnUiThread与handler message的区别
- UI更新方法Handler和runOnUiThread
- runOnUiThread和Handler机制更新UI
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- 【storm】win7-64位 storm安装
- ExtJs控件属性配置详细
- 为ffmpeg添加自定义滤镜
- windows+php5.5+apache2.4+tomcat+mod_jk配置
- js限制文本框只能输入数字方法小结
- Android通信:Handler和runOnUiThread()
- 古堡算式
- css内外边距样式
- 安卓实现按钮可随意拖动(同时解决click和touch事件的冲突)
- C语言笔记之关键字(二)
- JavaScript创建对象的三种方法
- hibernate 面试题
- 通过反射动态获取资源id
- win10下安装Mysql5.7