• Android访问网络(可以正常使用)


    以下是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();
    	@Override
    	protected 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{
    		@Override
    		public 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{
    		@Override
    		public 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 = "我是空";
    		@Override
    		public void run() {
    			
    			System.out.println("线程名:"+Thread.currentThread().getName());
    			//获取EditText 控件里的 uri
    			String 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();
    			//获取请求对象,并传入uri
    			HttpGet 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);
    		}
    	}
    }
    

      

  • 相关阅读:
    常见问题:bootstrap datepicker日期插件汉化
    好的插件
    问题11:web前端开发规范手册(转)
    问题10:获取当前页面宽度JS
    SQL学习1:基础
    问题9:tabtle 整理
    Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space
    测试markdown 博客功能
    Cannot generate SSPI context
    Ubuntu 13 Zookeeper 集群配置
  • 原文地址:https://www.cnblogs.com/Sunnor/p/4678946.html
Copyright © 2020-2023  润新知