網絡編程

線程間的通信
線程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();
}
具體操作方法和文件數據獲取差不多,只是在數據流的處理上有點區別。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章