您的位置:首页 > 理论基础 > 计算机网络

android——网络操作(一)连接网络

2014-04-28 22:26 197 查看
连接网络

一,包含许可

<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

二,选择HTTPClient

Android包含了
HttpURLConnection
和Apache
HttpClient
两种HTTPclients,推荐使用前者。详见Android'sHTTPClients.

三,检查网络连接

使用前应该检查一下网络的状态,以便执行相应的操作。用getActiveNetworkInfo()
isConnected()
来检查状态。

publicvoidmyClickHandler(Viewview){

...

ConnectivityManagerconnMgr=(ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();

if(networkInfo!=null&&networkInfo.isConnected()){

//fetchdata}else{//displayerror}

...

}


四,在独立的线程上进行网络操作

网络操作可能带来无法预测的延时,所以应该在独立于UI的线程中进行。
AsyncTask
类提供了简单的方法。详见MultithreadingForPerformance。

publicclassHttpExampleActivityextendsActivity{

privatestaticfinalStringDEBUG_TAG="HttpExample";

privateEditTexturlText;

privateTextViewtextView;


@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

urlText=(EditText)findViewById(R.id.myUrl);

textView=(TextView)findViewById(R.id.myText);

}


//当用户点击按钮,调用AsyncTask。

//在获取URL之前,先检查网络状态。

publicvoidmyClickHandler(Viewview){

//GetstheURLfromtheUI'stextfield.

StringstringUrl=urlText.getText().toString();

ConnectivityManagerconnMgr=(ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();

if(networkInfo!=null&&networkInfo.isConnected()){

newDownloadWebpageText().execute(stringUrl);

}else{

textView.setText("Nonetworkconnectionavailable.");

}

}


//用AsyncTask创建一个独立于UI的进程任务。

//任务需要一个URLstring用于创建HttpUrlConnection.Oncetheconnection

//一旦连接建立,AsyncTask将网页的内容作为一个InputStream类型下载。

//最后,将InputStream转化成string类型,并予以显示。

privateclassDownloadWebpageTextextendsAsyncTask{

@Override

protectedStringdoInBackground(String...urls){

//paramscomesfromtheexecute()call:params[0]istheurl.

try{

returndownloadUrl(urls[0]);

}catch(IOExceptione){

return"Unabletoretrievewebpage.URLmaybeinvalid.";

}

}

//onPostExecute显示AsyncTask的结果。

@Override

protectedvoidonPostExecute(Stringresult){

textView.setText(result);

}

}

...

}


五,连接和下载数据

在实现网络传输的进程中,可以用
HttpURLConnection
执行
GET
方法并下载数据。在调用了
connect()
方法之后,可以调用
getInputStream()
来获得
InputStream
类型的数据。

上面一段代码中,
doInBackground()
方法调用了
downloadUrl()
方法。而后者接受一个URL用于通过
HttpURLConnection
连接网络,一旦网络连接成功,可以调用
getInputStream()
来获得
InputStream
类型的数据。

//接受一个URL,建立HttpUrlConnection连接,并获取网页内容InputStream,并将其转换为

//string类型返回。

privateStringdownloadUrl(Stringmyurl)throwsIOException{

InputStreamis=null;

//只显示内容的前500个字

intlen=500;


try{

URLurl=newURL(myurl);

HttpURLConnectionconn=(HttpURLConnection)url.openConnection();

conn.setReadTimeout(10000/*milliseconds*/);

conn.setConnectTimeout(15000/*milliseconds*/);

conn.setRequestMethod("GET");

conn.setDoInput(true);

//Startsthequery

conn.connect();

intresponse=conn.getResponseCode();

Log.d(DEBUG_TAG,"Theresponseis:"+response);

is=conn.getInputStream();


//ConverttheInputStreamintoastring

StringcontentAsString=readIt(is,len);

returncontentAsString;


//保证InputStream在应用结束时被关闭。

}finally{

if(is!=null){

is.close();

}

}

}


六,将InputStream转为String类型

InputStream
类型可以按字节读取,通常在获得之后将其转换为目标类型的数据。比如,如果你需要的是Image类型的数据,你可以这样显示:

InputStreamis=null;

...

Bitmapbitmap=BitmapFactory.decodeStream(is);

ImageViewimageView=(ImageView)findViewById(R.id.image_view);

imageView.setImageBitmap(bitmap);


本例中,
InputStream
代表的是网页中的text数据,以下是如何将
InputStream
转换成string类型的数据用于UI中的显示:

//ReadsanInputStreamandconvertsittoaString.

publicStringreadIt(InputStreamstream,intlen)throwsIOException,UnsupportedEncodingException{

Readerreader=null;

reader=newInputStreamReader(stream,"UTF-8");

char[]buffer=newchar[len];

reader.read(buffer);

returnnewString(buffer);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: