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
原创粉丝点击