Android访问网络(可以正常使用)
16lz
2021-01-24
以下是MainActiviy.java,有必要的注释,里面用到了handler,以及线程,workThread如何更新mainThread才能够更新的内容。
package com.wyl.httptest2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends ActionBarActivity {Button btn;Button btn2;EditText et;Handler myhandler = new myHandler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button)findViewById(R.id.btnId);btn2 = (Button)findViewById(R.id.btnId2);MyOnclickListener l = new MyOnclickListener();et = (EditText)findViewById(R.id.editTextId);btn.setOnClickListener(l);//绑定监听器btn2.setOnClickListener(l);}class MyOnclickListener implements OnClickListener{@Overridepublic void onClick(View v) {if(v.getId()==R.id.btnId){//原则:UI中的主线程不能够直接访问网络System.out.println("====线程名:"+Thread.currentThread().getName());getInternetThread myThread = new getInternetThread();myThread.start();}else if(v.getId()==R.id.btnId2){System.out.println("你点了清除按钮,");//如果是清除按钮,那么editText中的内容et.setText("");}}}/* * 原理:因为Looper会自动地从队列里去取数据,然后自动调用继承了Handler对象的类的复写了的 * public void handleMessage(Message msg){}这个方法。 * 继承Handler的目的: * 为了把从workThread获取的数据写入到UI中(Android中UI线程,即主线程是不能够访问网络的) * @author Administrator * */class myHandler extends Handler{@Overridepublic void handleMessage(Message msg) {//打印出来是main线程,这样我们就可以直接把msg的值取出来了,System.out.println("====我是什么线程呢:"+Thread.currentThread().getName());//取出msg(取出msg.obj),这个绑定的obj属性才是我们真正要的值String fhz = (String)msg.obj;et.setText(fhz);}}/* * 主线程(即前台点击事件相关的线程)不能够直接访问网络,那么就通过主线程启动 * getInternetThread这个新线程(肯定就是workThread了),然后通过这个workThread进行 * 网络的访问,并且这个线程把网络数据绑定到msg的obj属性上(只要走到这一步就行了,update * 前台UI中的数据只需要交给继承了Handler的类的复写的Handler中的public void handleMessage(Message msg) * 这个方法,这个方法会自动执行。) * @author Administrator * */class getInternetThread extends Thread{String line = "我是空";@Overridepublic void run() {System.out.println("线程名:"+Thread.currentThread().getName());//获取EditText 控件里的 uriString uri = et.getText().toString();if(!uri.contains("http://")){//如果网址不包含htt://的话那么就不能够正常访问网络Message m = myhandler.obtainMessage();m.obj = "仙人板板的,你的网址没有http://!!!";myhandler.sendMessage(m);return;}System.out.println("uri的值:"+uri);//访问网络//获取客户端对象HttpClient client = new DefaultHttpClient();//获取请求对象,并传入uriHttpGet get = new HttpGet(uri);//客户端发送请求对象try {HttpResponse resp = client.execute(get);//获取状态码,如果是200说明成功int code = resp.getStatusLine().getStatusCode();if(code == 200){//获得返回值InputStream in = resp.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in));line = reader.readLine();}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//et.setText(line);//设置EditText的值Message msg = myhandler.obtainMessage();msg.obj = line;//这一步就把我们需要写到UI中的内容绑定到了msg上myhandler.sendMessage(msg);}}}
更多相关文章
- 使用过时的HttpClient
- Android(安卓)---js与java的相互调用
- android音量设置from top to bottom
- android 屏幕分辨率与密度,dip与px的区别(整合自网络资源)
- android尝鲜
- 【Android】Web开发之显示网络图片的两种方法
- Android的postOnAnimation分析
- android 手机虚拟按键 震动过程的追溯(1)
- Android(安卓)之 远程图片获取和本地缓存