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);
		}
	}
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设置Android Studio虚拟机可以访问网络,你可以按照以下步骤进行操作: 1. 确保你的虚拟机的网络设置正确。在Android Studio中,打开AVD Manager(Android Virtual Device Manager),选择你要修改的虚拟机,点击右侧的“编辑”按钮。在“虚拟设备配置”窗口中,确保“网络”选项设置为“NAT”或“桥接模式”,这样虚拟机才能与主机进行网络通信。 2. 检查你的主机防火墙设置。有时候,防火墙可能会阻止虚拟机与外部网络的连接。确保你的防火墙允许虚拟机访问网络。 3. 检查你的网络连接设置。确保你的主机已经连接到互联网,并且网络连接正常。如果你的主机无法访问网络,那么虚拟机也无法访问网络。 4. 如果你使用的是代理服务器,你需要在虚拟机中配置代理设置。在虚拟机中打开设置,找到“网络和互联网”选项,然后选择“代理”。在代理设置中,输入你的代理服务器地址和端口号。 通过以上步骤,你应该能够成功设置Android Studio虚拟机可以访问网络。如果问题仍然存在,请参考引用\[1\]和引用\[2\]中提供的链接,其中包含了更多关于解决虚拟机无法访问网络的方法和教程。 #### 引用[.reference_title] - *1* [AndroidStudio中虚拟机的联网问题](https://blog.csdn.net/mfysss/article/details/128003750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Android Studio 移动虚拟机](https://blog.csdn.net/weixin_42526166/article/details/117285090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值