zoukankan      html  css  js  c++  java
  • 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);
    		}
    	}
    }
    

      

  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/Sunnor/p/4678946.html
Copyright © 2011-2022 走看看