网络编程

线程间的通信
线程1把Message发给Handler,Handler会把Message放到一个叫做MessageQuene,这个时候Looper会把MessageQuene中去message给另一个线程,这就是两个线程的通信。
Handler的注意事项
在导包的时候有两个Handler,需要选择android.os.Handler
CallBack在Android中有很多,所以我们需要在前面加上Handler.CallBack
所有的控件都是主线程下创建的-View-能显示的内容基本上都是主线程下创建的
同步:一次只有一个线程去访问数据,或者对象
异步:几个线程可以同时访问数据,或者对象,某些控件可以异步访问,比如ProgressBar
Application Not Responding:无响应—缩写 ANR
一般无响应有两种情况:1.主线程进行了耗时操作,一般为5~10s

Socket:网络的长连接 三次握手(比如,第一次握手:游戏登陆时连接服务端 第二次握手:游戏过程的实时数据传递 第三次握手:游戏结束时的数据同步)
HTTP:网络的短连接 1.像服务端发送请求 2.服务端像客户端发送数据
网络通信
Java访问体系:HttpUrlConnection是由socket过来的:一般都用Get方式
Android访问体系:HttpClient,由HttpUrlConnection封装过来的:一般都用Post方式
访问方式
Get方式--》请求的是静态页面,每一个对象利用Get请求回来的数据都是一样的
Post方式--》请求的是动态页面,每一个对象利用Post请求回来的数据都是不一样
当数据发生改变的时候,让Adapter重新加载,更新listview对象显示的内容 adapter.notifyDataAetChanged();

Android网络编程
网络编程无非就是对服务端的文件或者图片显示在本地手机界面上,具体应该怎么从服务端获取文件和图片的数据呢?我们用下面的两段代码进行说明。
把文件或者数据显示在本地手机界面上其实就是对数据的下载,我们需要用到线程操作。首先说一下文件类型的数据显示:

Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
String str=msg.obj.toString();
tv.setText(str);
return false;
}
});
handler的作用就是把子线程和主线程联系起来,把子线程中的数据可以传到主线程,也就是UI线程的某个空间中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get);
tv=(TextView) findViewById(R.id.tv1);
thread =new Thread(this);
thread.start();

}

这个方法相当于Android中程序的程序入口,在这里进行一些控件的初始化,和开启子线程。

public void run(){
try{
//1.新建一個URL对象,网址指向的是一个JSON文件
URL url=new URL(" http://api.gougouvideo.com:8888/index_lists.php?v=1.7.0");
//2.通过URL对象构建HTTPURLconnection对象
HttpURLConnection http=(HttpURLConnection) url.openConnection();
//3.通过HttpURLConnection对象得到输入流对象
InputStream in=http.getInputStream();
//4.处理输入流信息
String index="";
byte[] b=new byte[1024];

while (in.read(b,0,1024)!=-1){

//byte型数组,每次读取1kb的内容,直至这个文件内容被读取完毕

index+=new String(b,0,1024,"GBK");
}
in.close();
//5.信息处理完毕后,传给Handler
Message msg=new Message();
msg.obj=index;
handler.sendMessage(msg);
}catch(Exception e){
e.printStackTrace();
}
再来看获取图片的方式
//这个网址是上面那个JSON文件中的某个图片的网址
String url=" http://r4.ykimg.com//0510000055AF4E3F67BC3D3E0D091E3A";

Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
img.setImageBitmap((Bitmap)msg.obj);
return false;
}
});

public void run() {
// TODO Auto-generated method stub
getNet(url);
}
public void getNet(String imgurl){
try{
//1.新建一個URl对象
URL url=new URL(imgurl);
//2.通过URL对象构建HTTPURLconnection对象
HttpURLConnection http=(HttpURLConnection) url.openConnection();
//3.通过HttpURLConnection对象得到输入流对象
InputStream in=http.getInputStream();
//4.处理输入流信息
Bitmap map=BitmapFactory.decodeStream(in);
//5.信息处理完毕后,传给Handler
Message msg=new Message();
msg.obj=map;
handler.sendMessage(msg);
}catch(Exception e){
e.printStackTrace();
}
具体操作方法和文件数据获取差不多,只是在数据流的处理上有点区别。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值