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);
}
}
}
Android访问网络(可以正常使用)的更多相关文章
- Android访问网络
Android中访问网络用的是HttpClient的方式,即Apache提供的一个jar包.安卓中继承了改jar包,所以安卓adt中不需要专门import该jar,直接就可以使用. 以下是MainAc ...
- [转]Android访问网络,使用HttpURLConnection还是HttpClient
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12452307 最近在研究Volley框架的源码,发现它在HTTP请求的使用上比较有 ...
- Android访问网络,使用HttpURLConnection还是HttpClient?
本文转自:http://blog.csdn.net/guolin_blog/article/details/12452307,感谢这位网友的分享,谢谢. 最近在研究Volley框架的源码,发现它在HT ...
- [转]android访问网络:java.net.ConnectException: localhost/127.0.0.1:8888 - Connection refused
这对刚学会向tomcat模拟的本地服务器发送请求的同学非常重要! 转自:http://wing123.iteye.com/blog/1873763 描述:在做注册功能的时候,向本地服务器:127.0. ...
- Android访问网络数据的几种方式Demo
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看 ...
- android访问网络--okhttp
import com.squareup.okhttp.MediaType;import com.squareup.okhttp.OkHttpClient;import com.squareup.okh ...
- .Net程序员安卓学习之路2:访问网络API
做应用型的APP肯定是要和网络交互的,那么本节就来实战一把Android访问网络API,还是使用上节的DEMO: 一.准备API: 一般都采用Json作为数据交换格式,目前各种语言均能输出Json串. ...
- 深入学习Android有关网络连接的内容
基于实际项目中碰到的些许问题,开始重新深入学习Android网络连接有关知识. Android的4.1.2版本的AndroidHttpClient模块setSoTimeout之后实际超时时间和设置的时 ...
- android 使用httpclient访问网络
在主活动类中,调用一个线程访问网络(android4.0以上耗时的操作不能放在主线程中): //声明两个Button对象,与一个TextView对象private TextView mTe ...
随机推荐
- relative、absolute和float
relative.absolute和float position:relative和position:absolute都可以改变元素在文档中的位置,都能激活元素的left.top.right.bo ...
- php基础教程笔记2
如果学过c.java,php的语法不学即会,但是不同的是php是一种脚本语言,需要解释器才能运行.php又和js不同,js是客户端语言,而php运行在服务器端,它无法获取客户端浏览器信息.但是php又 ...
- Latex调整行距
修改行间距的方法: \usepackage{setspace}%使用间距宏包 \begin{document} \begin{spacing}{2.0}%%行间距变为double-space 双倍行距 ...
- MVC-04 视图(1)
不可否认的,View应该是整个ASP.NET MVC项目开发过程中最花时间的部分,因为与显示逻辑相关的技术五花八门,你可能要学习的有HTML.CSS.JavaScript.DOM.JQuery.JSO ...
- 关于switch的思考和总结
1.通常每个case的末尾都应该加个break; 否则会default分支也会被执行 var score = 40;switch (score){case 50:console.log('50');/ ...
- 射频识别技术漫谈(19)——Desfire的3次握手认证和段密码生成
3次握手认证并生成临时的通讯密钥在通讯技术中的应用非常普遍,Mifare Desfire也使用了这种成熟的认证加密方法.Desfire在卡片数据传输前使用DES或3DES进行3次握手认证,认证成功一方 ...
- mac 下安装和卸载 mysql
这里有一篇文章写得很详细: http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 关于卸载,我也百度了下.找了好几个 ...
- out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
编译出错: out/target/common/obj/PACKAGING/public_api.txt:22549: error 17: Field android.view.KeyEvent.KE ...
- authorization 元素(ASP.NET 设置架构)
authorization 元素(ASP.NET 设置架构) 其他版本 1(共 1)对本文的评价是有帮助 - 评价此主题 [本文档仅供预览,在以后的发行版中可能会发生更改.包含的空白主题用作占位符.] ...
- 用Aspose.Cells控件读取Excel
Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...