- 浏览: 535061 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (533)
- spring (8)
- struts (21)
- hibernate (17)
- java其他 (73)
- 设计模式 (2)
- 开发软件/插件 (26)
- android (8)
- extjs4 (1)
- 网络编程 (4)
- 生活杂记 (3)
- ibatis (5)
- 应用服务器 (4)
- js (26)
- html/css (16)
- linux (0)
- db (32)
- jsp/servlet (13)
- xml (9)
- webservice (10)
- 错误/异常处理 (23)
- 线程 (10)
- maven (7)
- lucene (2)
- python (0)
- 报表 (1)
- mongodb (6)
- restful (6)
- ssl (1)
最新评论
-
zmwxiaoming:
...
struts2拦截器验证登陆状态 -
u012413283:
感谢楼主,同样的问题解决了
eclipse下安装m2e的maven插件报错的各类解决方案(含pom editor没装好的解决方案) -
javalucky:
你妹,想不吐槽都不行啊,eclipse 那来的maven4My ...
clipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin: -
zhaoyh82:
感谢楼主
eclipse下安装m2e的maven插件报错的各类解决方案(含pom editor没装好的解决方案) -
hua2011:
按照楼主说的,还是没有出现pom editor编辑器,麻烦楼主 ...
eclipse下安装m2e的maven插件报错的各类解决方案(含pom editor没装好的解决方案)
android执行网络操作
本篇我们会介绍连接到网络中涉及的基本任务,监测的网络连接(包括连接更改),并给予用户控制应用程序的网络使用情况。还介绍了如何解析和使用XML数据。
这个类包含一个示例应用程序来说明如何执行常见的网络操作。您可以下载示例(在右边),并用它作为自己的应用程序源代码的可重用代码。本章的重点有三:
1.连接到网络
2.管理网络的使用
3.解析XML数据
一、连接到网络
在mainfest中声明权限,代码如下:
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
选择http客户端
大多数联网的Android应用程序使用HTTP来发送和接收数据。Android包括两个HTTP客户:HttpURLConnection HttpClient和Apache。都支持HTTPS,流媒体上传和下载,可配置的超时,IPv6,和连接池。我们建议使用HttpURLConnection目标应用程序。
检查网络连接
在你的应用程序尝试连接到网络,它应该检查是否一个网络连接可用使用getActiveNetworkInfo()和一个()。记住,这个装置可能范围的一个网络,或用户可能已经禁用wi - fi和移动数据访问。
- publicvoidmyClickHandler(Viewview){
- ...
- ConnectivityManagerconnMgr=(ConnectivityManager)
- getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();
- if(networkInfo!=null&&networkInfo.isConnected()){
- //fetchdata
- }else{
- //displayerror
- }
- ...
- }
在单独线程中执行网络操作
网络操作可以包括不可预测的延迟。为了防止这种导致一个糟糕的用户体验,总是执行网络操作在一个单独的线程。
- 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);
- }
- //Whenuserclicksbutton,callsAsyncTask.
- //BeforeattemptingtofetchtheURL,makessurethatthereisanetworkconnection.
- 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.");
- }
- }
- //UsesAsyncTasktocreateataskawayfromthemainUIthread.Thistasktakesa
- //URLstringandusesittocreateanHttpUrlConnection.Oncetheconnection
- //hasbeenestablished,theAsyncTaskdownloadsthecontentsofthewebpageas
- //anInputStream.Finally,theInputStreamisconvertedintoastring,whichis
- //displayedintheUIbytheAsyncTask'sonPostExecutemethod.
- privateclassDownloadWebpageTextextendsAsyncTask{
- @Override
- protectedStringdoInBackground(String...urls){
- //paramscomesfromtheexecute()call:params[0]istheurl.
- try{
- returndownloadUrl(urls[0]);
- }catch(IOExceptione){
- return"Unabletoretrievewebpage.URLmaybeinvalid.";
- }
- }
- //onPostExecutedisplaystheresultsoftheAsyncTask.
- @Override
- protectedvoidonPostExecute(Stringresult){
- textView.setText(result);
- }
- }
- ...
- }
连接和下载数据
在你的线程执行您的网络交易,你可以使用HttpURLConnection来执行一个GET和下载数据。在您调用connect(),你可以得到一个InputStream的数据通过调用getInputStream()。
- //GivenaURL,establishesanHttpUrlConnectionandretrieves
- //thewebpagecontentasaInputStream,whichitreturnsas
- //astring.
- privateStringdownloadUrl(Stringmyurl)throwsIOException{
- InputStreamis=null;
- //Onlydisplaythefirst500charactersoftheretrieved
- //webpagecontent.
- 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;
- //MakessurethattheInputStreamisclosedaftertheappis
- //finishedusingit.
- }finally{
- if(is!=null){
- is.close();
- }
- }
- }
getResponseCode()返回连接的状态码。这是一种有用的方式获得一些额外的信息的连接。一个200的状态代码表示成功。
转换InputStream到String
- //ReadsanInputStreamandconvertsittoaString.
- publicStringreadIt(InputStreamstream,intlen)throwsIOException,UnsupportedEncodingException{
- Readerreader=null;
- reader=newInputStreamReader(stream,"UTF-8");
- char[]buffer=newchar[len];
- reader.read(buffer);
- returnnewString(buffer);
- }
二、管理网络
检查设备的网络连接
一个设备可以有各种类型的网络连接。这节课的重点是使用wi - fi或手机或网络连接,这个代码片段测试网络连接wi - fi和移动。它确定这些网络接口是可用的或连接的(即网络连接是否存在,如果可以建立套接字和传递数据)
- privatestaticfinalStringDEBUG_TAG="NetworkStatusExample";
- ...
- ConnectivityManagerconnMgr=(ConnectivityManager)
- getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfonetworkInfo=connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
- booleanisWifiConn=networkInfo.isConnected();
- networkInfo=connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
- booleanisMobileConn=networkInfo.isConnected();
- Log.d(DEBUG_TAG,"Wificonnected:"+isWifiConn);
- Log.d(DEBUG_TAG,"Mobileconnected:"+isMobileConn);
管理网络的使用
您可以实现一个首选项活动,让用户明确控制应用程序的使用网络资源。例如:1.你可能允许用户上传的视频只有当设备被连接到wi - fi网络。2.你可能会同步(或没有)根据特定标准如网络可用性、时间间隔,等等。
编写一个应用程序,支持网络访问和管理网络的使用,你的清单必须有正确的权限和意图过滤器。
在样例应用程序中,这个规定了SettingsActivity,将显示一个UI让用户知道何时可以进行下载操作。
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.android.networkusage"
- ...>
- <uses-sdkandroid:minSdkVersion="4"
- android:targetSdkVersion="14"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <application
- ...>
- ...
- <activityandroid:label="SettingsActivity"android:name=".SettingsActivity">
- <intent-filter>
- <actionandroid:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
- publicclassSettingsActivityextendsPreferenceActivityimplementsOnSharedPreferenceChangeListener{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //LoadstheXMLpreferencesfile
- addPreferencesFromResource(R.xml.preferences);
- }
- @Override
- protectedvoidonResume(){
- super.onResume();
- //Registersalistenerwheneverakeychanges
- getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
- }
- @Override
- protectedvoidonPause(){
- super.onPause();
- //UnregistersthelistenersetinonResume().
- //It'sbestpracticetounregisterlistenerswhenyourappisn'tusingthemtocutdownon
- //unnecessarysystemoverhead.YoudothisinonPause().
- getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
- }
- //Whentheuserchangesthepreferencesselection,
- //onSharedPreferenceChanged()restartsthemainactivityasanew
- //task.SetsthetherefreshDisplayflagto"true"toindicatethat
- //themainactivityshouldupdateitsdisplay.
- //ThemainactivityqueriesthePreferenceManagertogetthelatestsettings.
- @Override
- publicvoidonSharedPreferenceChanged(SharedPreferencessharedPreferences,Stringkey){
- //SetsrefreshDisplaytotruesothatwhentheuserreturnstothemain
- //activity,thedisplayrefreshestoreflectthenewsettings.
- NetworkActivity.refreshDisplay=true;
- }
- }
响应网络变动
如果有一个匹配发生在设置和设备的网络连接(例如,如果设置为“wi - fi”和设备有一个wi - fi连接)之间,应用程序下载提继续并刷新显示
- publicclassNetworkActivityextendsActivity{
- publicstaticfinalStringWIFI="Wi-Fi";
- publicstaticfinalStringANY="Any";
- privatestaticfinalStringURL="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest";
- //WhetherthereisaWi-Ficonnection.
- privatestaticbooleanwifiConnected=false;
- //Whetherthereisamobileconnection.
- privatestaticbooleanmobileConnected=false;
- //Whetherthedisplayshouldberefreshed.
- publicstaticbooleanrefreshDisplay=true;
- //Theuser'scurrentnetworkpreferencesetting.
- publicstaticStringsPref=null;
- //TheBroadcastReceiverthattracksnetworkconnectivitychanges.
- privateNetworkReceiverreceiver=newNetworkReceiver();
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //RegistersBroadcastReceivertotracknetworkconnectionchanges.
- IntentFilterfilter=newIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
- receiver=newNetworkReceiver();
- this.registerReceiver(receiver,filter);
- }
- @Override
- publicvoidonDestroy(){
- super.onDestroy();
- //UnregistersBroadcastReceiverwhenappisdestroyed.
- if(receiver!=null){
- this.unregisterReceiver(receiver);
- }
- }
- //Refreshesthedisplayifthenetworkconnectionandthe
- //prefsettingsallowit.
- @Override
- publicvoidonStart(){
- super.onStart();
- //Getstheuser'snetworkpreferencesettings
- SharedPreferencessharedPrefs=PreferenceManager.getDefaultSharedPreferences(this);
- //Retrievesastringvalueforthepreferences.Thesecondparameter
- //isthedefaultvaluetouseifapreferencevalueisnotfound.
- sPref=sharedPrefs.getString("listPref","Wi-Fi");
- updateConnectedFlags();
- if(refreshDisplay){
- loadPage();
- }
- }
- //ChecksthenetworkconnectionandsetsthewifiConnectedandmobileConnected
- //variablesaccordingly.
- publicvoidupdateConnectedFlags(){
- ConnectivityManagerconnMgr=(ConnectivityManager)
- getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfoactiveInfo=connMgr.getActiveNetworkInfo();
- if(activeInfo!=null&&activeInfo.isConnected()){
- wifiConnected=activeInfo.getType()==ConnectivityManager.TYPE_WIFI;
- mobileConnected=activeInfo.getType()==ConnectivityManager.TYPE_MOBILE;
- }else{
- wifiConnected=false;
- mobileConnected=false;
- }
- }
- //UsesAsyncTasksubclasstodownloadtheXMLfeedfromstackoverflow.com.
- publicvoidloadPage(){
- if(((sPref.equals(ANY))&&(wifiConnected||mobileConnected))
- ||((sPref.equals(WIFI))&&(wifiConnected))){
- //AsyncTasksubclass
- newDownloadXmlTask().execute(URL);
- }else{
- showErrorPage();
- }
- }
- ...
- }
检测网络连接变化
- publicclassNetworkReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- ConnectivityManagerconn=(ConnectivityManager)
- context.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfonetworkInfo=conn.getActiveNetworkInfo();
- //Checkstheuserprefsandthenetworkconnection.Basedontheresult,decideswhether
- //torefreshthedisplayorkeepthecurrentdisplay.
- //IftheuserprefisWi-Fionly,checkstoseeifthedevicehasaWi-Ficonnection.
- if(WIFI.equals(sPref)&&networkInfo!=null&&networkInfo.getType()==ConnectivityManager.TYPE_WIFI){
- //IfdevicehasitsWi-Ficonnection,setsrefreshDisplay
- //totrue.Thiscausesthedisplaytoberefreshedwhentheuser
- //returnstotheapp.
- refreshDisplay=true;
- Toast.makeText(context,R.string.wifi_connected,Toast.LENGTH_SHORT).show();
- //IfthesettingisANYnetworkandthereisanetworkconnection
- //(whichbyprocessofeliminationwouldbemobile),setsrefreshDisplaytotrue.
- }elseif(ANY.equals(sPref)&&networkInfo!=null){
- refreshDisplay=true;
- //Otherwise,theappcan'tdownloadcontent--eitherbecausethereisnonetwork
- //connection(mobileorWi-Fi),orbecausetheprefsettingisWIFI,andthere
- //isnoWi-Ficonnection.
- //SetsrefreshDisplaytofalse.
- }else{
- refreshDisplay=false;
- Toast.makeText(context,R.string.lost_connection,Toast.LENGTH_SHORT).show();
- }
- }
三、解析xml
上传和解析XML数据是很常见的任务,网络连接应用程序。这一课解释了如何解析XML文档并使用他们的数据
选择转换器
我们建议XmlPullParser,这是一种高效且可维护的方式来解析XML在Android里。
分析需求
- <?xmlversion="1.0"encoding="utf-8"?>
- <feedxmlns="http://www.w3.org/2005/Atom"xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"...">
- <titletype="text">newestquestionstaggedandroid-StackOverflow</title>
- ...
- <entry>
- ...
- </entry>
- <entry>
- <id>http://stackoverflow.com/q/9439999</id>
- <re:rankscheme="http://stackoverflow.com">0</re:rank>
- <titletype="text">Whereismydatafile?</title>
- <categoryscheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags"term="android"/>
- <categoryscheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags"term="file"/>
- <author>
- <name>cliff2310</name>
- <uri>http://stackoverflow.com/users/1128925</uri>
- </author>
- <linkrel="alternate"href="http://stackoverflow.com/questions/9439999/where-is-my-data-file"/>
- <published>2012-02-25T00:30:54Z</published>
- <updated>2012-02-25T00:30:54Z</updated>
- <summarytype="html">
- <p>IhaveanApplicationthatrequiresadatafile...</p>
- </summary>
- </entry>
- <entry>
- ...
- </entry>
- ...
- </feed>
实例化转化器
- publicclassStackOverflowXmlParser{
- //Wedon'tusenamespaces
- privatestaticfinalStringns=null;
- publicListparse(InputStreamin)throwsXmlPullParserException,IOException{
- try{
- XmlPullParserparser=Xml.newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,false);
- parser.setInput(in,null);
- parser.nextTag();
- returnreadFeed(parser);
- }finally{
- in.close();
- }
- }
- ...
- }
- 读取xml
- privateListreadFeed(XmlPullParserparser)throwsXmlPullParserException,IOException{
- Listentries=newArrayList();
- parser.require(XmlPullParser.START_TAG,ns,"feed");
- while(parser.next()!=XmlPullParser.END_TAG){
- if(parser.getEventType()!=XmlPullParser.START_TAG){
- continue;
- }
- Stringname=parser.getName();
- //Startsbylookingfortheentrytag
- if(name.equals("entry")){
- entries.add(readEntry(parser));
- }else{
- skip(parser);
- }
- }
- returnentries;
- }
下面这个代码片段展示了如何解析器解析条目、标题、链接和总结:
- publicstaticclassEntry{
- publicfinalStringtitle;
- publicfinalStringlink;
- publicfinalStringsummary;
- privateEntry(Stringtitle,Stringsummary,Stringlink){
- this.title=title;
- this.summary=summary;
- this.link=link;
- }
- }
- //Parsesthecontentsofanentry.Ifitencountersatitle,summary,orlinktag,handsthemoff
- //totheirrespective"read"methodsforprocessing.Otherwise,skipsthetag.
- privateEntryreadEntry(XmlPullParserparser)throwsXmlPullParserException,IOException{
- parser.require(XmlPullParser.START_TAG,ns,"entry");
- Stringtitle=null;
- Stringsummary=null;
- Stringlink=null;
- while(parser.next()!=XmlPullParser.END_TAG){
- if(parser.getEventType()!=XmlPullParser.START_TAG){
- continue;
- }
- Stringname=parser.getName();
- if(name.equals("title")){
- title=readTitle(parser);
- }elseif(name.equals("summary")){
- summary=readSummary(parser);
- }elseif(name.equals("link")){
- link=readLink(parser);
- }else{
- skip(parser);
- }
- }
- returnnewEntry(title,summary,link);
- }
- //Processestitletagsinthefeed.
- privateStringreadTitle(XmlPullParserparser)throwsIOException,XmlPullParserException{
- parser.require(XmlPullParser.START_TAG,ns,"title");
- Stringtitle=readText(parser);
- parser.require(XmlPullParser.END_TAG,ns,"title");
- returntitle;
- }
- //Processeslinktagsinthefeed.
- privateStringreadLink(XmlPullParserparser)throwsIOException,XmlPullParserException{
- Stringlink="";
- parser.require(XmlPullParser.START_TAG,ns,"link");
- Stringtag=parser.getName();
- StringrelType=parser.getAttributeValue(null,"rel");
- if(tag.equals("link")){
- if(relType.equals("alternate")){
- link=parser.getAttributeValue(null,"href");
- parser.nextTag();
- }
- }
- parser.require(XmlPullParser.END_TAG,ns,"link");
- returnlink;
- }
- //Processessummarytagsinthefeed.
- privateStringreadSummary(XmlPullParserparser)throwsIOException,XmlPullParserException{
- parser.require(XmlPullParser.START_TAG,ns,"summary");
- Stringsummary=readText(parser);
- parser.require(XmlPullParser.END_TAG,ns,"summary");
- returnsummary;
- }
- //Forthetagstitleandsummary,extractstheirtextvalues.
- privateStringreadText(XmlPullParserparser)throwsIOException,XmlPullParserException{
- Stringresult="";
- if(parser.next()==XmlPullParser.TEXT){
- result=parser.getText();
- parser.nextTag();
- }
- returnresult;
- }
- ...
- }
跳过无用的标签
- privatevoidskip(XmlPullParserparser)throwsXmlPullParserException,IOException{
- if(parser.getEventType()!=XmlPullParser.START_TAG){
- thrownewIllegalStateException();
- }
- intdepth=1;
- while(depth!=0){
- switch(parser.next()){
- caseXmlPullParser.END_TAG:
- depth--;
- break;
- caseXmlPullParser.START_TAG:
- depth++;
- break;
- }
- }
- }
使用xml数据
- publicclassNetworkActivityextendsActivity{
- publicstaticfinalStringWIFI="Wi-Fi";
- publicstaticfinalStringANY="Any";
- privatestaticfinalStringURL="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest";
- //WhetherthereisaWi-Ficonnection.
- privatestaticbooleanwifiConnected=false;
- //Whetherthereisamobileconnection.
- privatestaticbooleanmobileConnected=false;
- //Whetherthedisplayshouldberefreshed.
- publicstaticbooleanrefreshDisplay=true;
- publicstaticStringsPref=null;
- ...
- //UsesAsyncTasktodownloadtheXMLfeedfromstackoverflow.com.
- publicvoidloadPage(){
- if((sPref.equals(ANY))&&(wifiConnected||mobileConnected)){
- newDownloadXmlTask().execute(URL);
- }
- elseif((sPref.equals(WIFI))&&(wifiConnected)){
- newDownloadXmlTask().execute(URL);
- }else{
- //showerror
- }
- }
动态下载xml
- //ImplementationofAsyncTaskusedtodownloadXMLfeedfromstackoverflow.com.
- privateclassDownloadXmlTaskextendsAsyncTask<String,Void,String>{
- @Override
- protectedStringdoInBackground(String...urls){
- try{
- returnloadXmlFromNetwork(urls[0]);
- }catch(IOExceptione){
- returngetResources().getString(R.string.connection_error);
- }catch(XmlPullParserExceptione){
- returngetResources().getString(R.string.xml_error);
- }
- }
- @Override
- protectedvoidonPostExecute(Stringresult){
- setContentView(R.layout.main);
- //DisplaystheHTMLstringintheUIviaaWebView
- WebViewmyWebView=(WebView)findViewById(R.id.webview);
- myWebView.loadData(result,"text/html",null);
- }
- }
加载xml
- //UploadsXMLfromstackoverflow.com,parsesit,andcombinesitwith
- //HTMLmarkup.ReturnsHTMLstring.
- privateStringloadXmlFromNetwork(StringurlString)throwsXmlPullParserException,IOException{
- InputStreamstream=null;
- //Instantiatetheparser
- StackOverflowXmlParserstackOverflowXmlParser=newStackOverflowXmlParser();
- List<Entry>entries=null;
- Stringtitle=null;
- Stringurl=null;
- Stringsummary=null;
- CalendarrightNow=Calendar.getInstance();
- DateFormatformatter=newSimpleDateFormat("MMMddh:mmaa");
- //Checkswhethertheusersetthepreferencetoincludesummarytext
- SharedPreferencessharedPrefs=PreferenceManager.getDefaultSharedPreferences(this);
- booleanpref=sharedPrefs.getBoolean("summaryPref",false);
- StringBuilderhtmlString=newStringBuilder();
- htmlString.append("<h3>"+getResources().getString(R.string.page_title)+"</h3>");
- htmlString.append("<em>"+getResources().getString(R.string.updated)+""+
- formatter.format(rightNow.getTime())+"</em>");
- try{
- stream=downloadUrl(urlString);
- entries=stackOverflowXmlParser.parse(stream);
- //MakessurethattheInputStreamisclosedaftertheappis
- //finishedusingit.
- }finally{
- if(stream!=null){
- stream.close();
- }
- }
- //StackOverflowXmlParserreturnsaList(called"entries")ofEntryobjects.
- //EachEntryobjectrepresentsasinglepostintheXMLfeed.
- //ThissectionprocessestheentrieslisttocombineeachentrywithHTMLmarkup.
- //EachentryisdisplayedintheUIasalinkthatoptionallyincludes
- //atextsummary.
- for(Entryentry:entries){
- htmlString.append("<p><ahref='");
- htmlString.append(entry.link);
- htmlString.append("'>"+entry.title+"</a></p>");
- //Iftheusersetthepreferencetoincludesummarytext,
- //addsittothedisplay.
- if(pref){
- htmlString.append(entry.summary);
- }
- }
- returnhtmlString.toString();
- }
- //GivenastringrepresentationofaURL,setsupaconnectionandgets
- //aninputstream.
- privateInputStreamdownloadUrl(StringurlString)throwsIOException{
- URLurl=newURL(urlString);
- HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
- conn.setReadTimeout(10000/*milliseconds*/);
- conn.setConnectTimeout(15000/*milliseconds*/);
- conn.setRequestMethod("GET");
- conn.setDoInput(true);
- //Startsthequery
- conn.connect();
- InputStreamstream=conn.getInputStream();
- }
上面的片段代码为了帮助大家理解,这里还是老习惯,贴上项目的源代码,本来是有项目截图,运行效果图之类的图的,只是这篇文章太长了,再弄图片,就更占篇幅了,所以就只贴源码了,大家可以自己的运行起来看看,希望能从整体的架构和具体的代码细节上帮助到大家。
本篇我们会介绍连接到网络中涉及的基本任务,监测的网络连接(包括连接更改),并给予用户控制应用程序的网络使用情况。还介绍了如何解析和使用XML数据。这个类包含一个示例应用程序来说明如何执行常见的网络操作。您可以下载示例(在右边),并用它作为自己的应用程序源代码的可重用代码。本章的重点有三:
1.连接到网络
2.管理网络的使用
3.解析XML数据
一、连接到网络
在mainfest中声明权限,代码如下:
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
选择http客户端
大多数联网的Android应用程序使用HTTP来发送和接收数据。Android包括两个HTTP客户:HttpURLConnection HttpClient和Apache。都支持HTTPS,流媒体上传和下载,可配置的超时,IPv6,和连接池。我们建议使用HttpURLConnection目标应用程序。
检查网络连接
在你的应用程序尝试连接到网络,它应该检查是否一个网络连接可用使用getActiveNetworkInfo()和一个()。记住,这个装置可能范围的一个网络,或用户可能已经禁用wi - fi和移动数据访问。
- publicvoidmyClickHandler(Viewview){
- ...
- ConnectivityManagerconnMgr=(ConnectivityManager)
- getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfonetworkInfo=connMgr.getActiveNetworkInfo();
- if(networkInfo!=null&&networkInfo.isConnected()){
- //fetchdata
- }else{
- //displayerror
- }
- ...
- }
在单独线程中执行网络操作
网络操作可以包括不可预测的延迟。为了防止这种导致一个糟糕的用户体验,总是执行网络操作在一个单独的线程。
- 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);
- }
- //Whenuserclicksbutton,callsAsyncTask.
- //BeforeattemptingtofetchtheURL,makessurethatthereisanetworkconnection.
- 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.");
- }
- }
- //UsesAsyncTasktocreateataskawayfromthemainUIthread.Thistasktakesa
- //URLstringandusesittocreateanHttpUrlConnection.Oncetheconnection
- //hasbeenestablished,theAsyncTaskdownloadsthecontentsofthewebpageas
- //anInputStream.Finally,theInputStreamisconvertedintoastring,whichis
- //displayedintheUIbytheAsyncTask'sonPostExecutemethod.
- privateclassDownloadWebpageTextextendsAsyncTask{
- @Override
- protectedStringdoInBackground(String...urls){
- //paramscomesfromtheexecute()call:params[0]istheurl.
- try{
- returndownloadUrl(urls[0]);
- }catch(IOExceptione){
- return"Unabletoretrievewebpage.URLmaybeinvalid.";
- }
- }
- //onPostExecutedisplaystheresultsoftheAsyncTask.
- @Override
- protectedvoidonPostExecute(Stringresult){
- textView.setText(result);
- }
- }
- ...
- }
连接和下载数据
在你的线程执行您的网络交易,你可以使用HttpURLConnection来执行一个GET和下载数据。在您调用connect(),你可以得到一个InputStream的数据通过调用getInputStream()。
- //GivenaURL,establishesanHttpUrlConnectionandretrieves
- //thewebpagecontentasaInputStream,whichitreturnsas
- //astring.
- privateStringdownloadUrl(Stringmyurl)throwsIOException{
- InputStreamis=null;
- //Onlydisplaythefirst500charactersoftheretrieved
- //webpagecontent.
- 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;
- //MakessurethattheInputStreamisclosedaftertheappis
- //finishedusingit.
- }finally{
- if(is!=null){
- is.close();
- }
- }
- }
getResponseCode()返回连接的状态码。这是一种有用的方式获得一些额外的信息的连接。一个200的状态代码表示成功。
转换InputStream到String
- //ReadsanInputStreamandconvertsittoaString.
- publicStringreadIt(InputStreamstream,intlen)throwsIOException,UnsupportedEncodingException{
- Readerreader=null;
- reader=newInputStreamReader(stream,"UTF-8");
- char[]buffer=newchar[len];
- reader.read(buffer);
- returnnewString(buffer);
- }
二、管理网络
检查设备的网络连接
一个设备可以有各种类型的网络连接。这节课的重点是使用wi - fi或手机或网络连接,这个代码片段测试网络连接wi - fi和移动。它确定这些网络接口是可用的或连接的(即网络连接是否存在,如果可以建立套接字和传递数据)
- privatestaticfinalStringDEBUG_TAG="NetworkStatusExample";
- ...
- ConnectivityManagerconnMgr=(ConnectivityManager)
- getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfonetworkInfo=connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
- booleanisWifiConn=networkInfo.isConnected();
- networkInfo=connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
- booleanisMobileConn=networkInfo.isConnected();
- Log.d(DEBUG_TAG,"Wificonnected:"+isWifiConn);
- Log.d(DEBUG_TAG,"Mobileconnected:"+isMobileConn);
管理网络的使用
您可以实现一个首选项活动,让用户明确控制应用程序的使用网络资源。例如:1.你可能允许用户上传的视频只有当设备被连接到wi - fi网络。2.你可能会同步(或没有)根据特定标准如网络可用性、时间间隔,等等。
编写一个应用程序,支持网络访问和管理网络的使用,你的清单必须有正确的权限和意图过滤器。
在样例应用程序中,这个规定了SettingsActivity,将显示一个UI让用户知道何时可以进行下载操作。
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.android.networkusage"
- ...>
- <uses-sdkandroid:minSdkVersion="4"
- android:targetSdkVersion="14"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <application
- ...>
- ...
- <activityandroid:label="SettingsActivity"android:name=".SettingsActivity">
- <intent-filter>
- <actionandroid:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
- publicclassSettingsActivityextendsPreferenceActivityimplementsOnSharedPreferenceChangeListener{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //LoadstheXMLpreferencesfile
- addPreferencesFromResource(R.xml.preferences);
- }
- @Override
- protectedvoidonResume(){
- super.onResume();
- //Registersalistenerwheneverakeychanges
- getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
- }
- @Override
- protectedvoidonPause(){
- super.onPause();
- //UnregistersthelistenersetinonResume().
- //It'sbestpracticetounregisterlistenerswhenyourappisn'tusingthemtocutdownon
- //unnecessarysystemoverhead.YoudothisinonPause().
- getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
- }
- //Whentheuserchangesthepreferencesselection,
- //onSharedPreferenceChanged()restartsthemainactivityasanew
- //task.SetsthetherefreshDisplayflagto"true"toindicatethat
- //themainactivityshouldupdateitsdisplay.
- //ThemainactivityqueriesthePreferenceManagertogetthelatestsettings.
- @Override
- publicvoidonSharedPreferenceChanged(SharedPreferencessharedPreferences,Stringkey){
- //SetsrefreshDisplaytotruesothatwhentheuserreturnstothemain
- //activity,thedisplayrefreshestoreflectthenewsettings.
- NetworkActivity.refreshDisplay=true;
- }
- }
响应网络变动
如果有一个匹配发生在设置和设备的网络连接(例如,如果设置为“wi - fi”和设备有一个wi - fi连接)之间,应用程序下载提继续并刷新显示
- publicclassNetworkActivityextendsActivity{
- publicstaticfinalStringWIFI="Wi-Fi";
- publicstaticfinalStringANY="Any";
- privatestaticfinalStringURL="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest";
- //WhetherthereisaWi-Ficonnection.
- privatestaticbooleanwifiConnected=false;
- //Whetherthereisamobileconnection.
- privatestaticbooleanmobileConnected=false;
- //Whetherthedisplayshouldberefreshed.
- publicstaticbooleanrefreshDisplay=true;
- //Theuser'scurrentnetworkpreferencesetting.
- publicstaticStringsPref=null;
- //TheBroadcastReceiverthattracksnetworkconnectivitychanges.
- privateNetworkReceiverreceiver=newNetworkReceiver();
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //RegistersBroadcastReceivertotracknetworkconnectionchanges.
- IntentFilterfilter=newIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
- receiver=newNetworkReceiver();
- this.registerReceiver(receiver,filter);
- }
- @Override
- publicvoidonDestroy(){
- super.onDestroy();
- //UnregistersBroadcastReceiverwhenappisdestroyed.
- if(receiver!=null){
- this.unregisterReceiver(receiver);
- }
- }
- //Refreshesthedisplayifthenetworkconnectionandthe
- //prefsettingsallowit.
- @Override
- publicvoidonStart(){
- super.onStart();
- //Getstheuser'snetworkpreferencesettings
- SharedPreferencessharedPrefs=PreferenceManager.getDefaultSharedPreferences(this);
- //Retrievesastringvalueforthepreferences.Thesecondparameter
- //isthedefaultvaluetouseifapreferencevalueisnotfound.
- sPref=sharedPrefs.getString("listPref","Wi-Fi");
- updateConnectedFlags();
- if(refreshDisplay){
- loadPage();
- }
- }
- //ChecksthenetworkconnectionandsetsthewifiConnectedandmobileConnected
- //variablesaccordingly.
- publicvoidupdateConnectedFlags(){
- ConnectivityManagerconnMgr=(ConnectivityManager)
- getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfoactiveInfo=connMgr.getActiveNetworkInfo();
- if(activeInfo!=null&&activeInfo.isConnected()){
- wifiConnected=activeInfo.getType()==ConnectivityManager.TYPE_WIFI;
- mobileConnected=activeInfo.getType()==ConnectivityManager.TYPE_MOBILE;
- }else{
- wifiConnected=false;
- mobileConnected=false;
- }
- }
- //UsesAsyncTasksubclasstodownloadtheXMLfeedfromstackoverflow.com.
- publicvoidloadPage(){
- if(((sPref.equals(ANY))&&(wifiConnected||mobileConnected))
- ||((sPref.equals(WIFI))&&(wifiConnected))){
- //AsyncTasksubclass
- newDownloadXmlTask().execute(URL);
- }else{
- showErrorPage();
- }
- }
- ...
- }
检测网络连接变化
- publicclassNetworkReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- ConnectivityManagerconn=(ConnectivityManager)
- context.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfonetworkInfo=conn.getActiveNetworkInfo();
- //Checkstheuserprefsandthenetworkconnection.Basedontheresult,decideswhether
- //torefreshthedisplayorkeepthecurrentdisplay.
- //IftheuserprefisWi-Fionly,checkstoseeifthedevicehasaWi-Ficonnection.
- if(WIFI.equals(sPref)&&networkInfo!=null&&networkInfo.getType()==ConnectivityManager.TYPE_WIFI){
- //IfdevicehasitsWi-Ficonnection,setsrefreshDisplay
- //totrue.Thiscausesthedisplaytoberefreshedwhentheuser
- //returnstotheapp.
- refreshDisplay=true;
- Toast.makeText(context,R.string.wifi_connected,Toast.LENGTH_SHORT).show();
- //IfthesettingisANYnetworkandthereisanetworkconnection
- //(whichbyprocessofeliminationwouldbemobile),setsrefreshDisplaytotrue.
- }elseif(ANY.equals(sPref)&&networkInfo!=null){
- refreshDisplay=true;
- //Otherwise,theappcan'tdownloadcontent--eitherbecausethereisnonetwork
- //connection(mobileorWi-Fi),orbecausetheprefsettingisWIFI,andthere
- //isnoWi-Ficonnection.
- //SetsrefreshDisplaytofalse.
- }else{
- refreshDisplay=false;
- Toast.makeText(context,R.string.lost_connection,Toast.LENGTH_SHORT).show();
- }
- }
三、解析xml
上传和解析XML数据是很常见的任务,网络连接应用程序。这一课解释了如何解析XML文档并使用他们的数据
选择转换器
我们建议XmlPullParser,这是一种高效且可维护的方式来解析XML在Android里。
分析需求
- <?xmlversion="1.0"encoding="utf-8"?>
- <feedxmlns="http://www.w3.org/2005/Atom"xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"...">
- <titletype="text">newestquestionstaggedandroid-StackOverflow</title>
- ...
- <entry>
- ...
- </entry>
- <entry>
- <id>http://stackoverflow.com/q/9439999</id>
- <re:rankscheme="http://stackoverflow.com">0</re:rank>
- <titletype="text">Whereismydatafile?</title>
- <categoryscheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags"term="android"/>
- <categoryscheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags"term="file"/>
- <author>
- <name>cliff2310</name>
- <uri>http://stackoverflow.com/users/1128925</uri>
- </author>
- <linkrel="alternate"href="http://stackoverflow.com/questions/9439999/where-is-my-data-file"/>
- <published>2012-02-25T00:30:54Z</published>
- <updated>2012-02-25T00:30:54Z</updated>
- <summarytype="html">
- <p>IhaveanApplicationthatrequiresadatafile...</p>
- </summary>
- </entry>
- <entry>
- ...
- </entry>
- ...
- </feed>
实例化转化器
- publicclassStackOverflowXmlParser{
- //Wedon'tusenamespaces
- privatestaticfinalStringns=null;
- publicListparse(InputStreamin)throwsXmlPullParserException,IOException{
- try{
- XmlPullParserparser=Xml.newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,false);
- parser.setInput(in,null);
- parser.nextTag();
- returnreadFeed(parser);
- }finally{
- in.close();
- }
- }
- ...
- }
- 读取xml
- privateListreadFeed(XmlPullParserparser)throwsXmlPullParserException,IOException{
- Listentries=newArrayList();
- parser.require(XmlPullParser.START_TAG,ns,"feed");
- while(parser.next()!=XmlPullParser.END_TAG){
- if(parser.getEventType()!=XmlPullParser.START_TAG){
- continue;
- }
- Stringname=parser.getName();
- //Startsbylookingfortheentrytag
- if(name.equals("entry")){
- entries.add(readEntry(parser));
- }else{
- skip(parser);
- }
- }
- returnentries;
- }
下面这个代码片段展示了如何解析器解析条目、标题、链接和总结:
- publicstaticclassEntry{
- publicfinalStringtitle;
- publicfinalStringlink;
- publicfinalStringsummary;
- privateEntry(Stringtitle,Stringsummary,Stringlink){
- this.title=title;
- this.summary=summary;
- this.link=link;
- }
- }
- //Parsesthecontentsofanentry.Ifitencountersatitle,summary,orlinktag,handsthemoff
- //totheirrespective"read"methodsforprocessing.Otherwise,skipsthetag.
- privateEntryreadEntry(XmlPullParserparser)throwsXmlPullParserException,IOException{
- parser.require(XmlPullParser.START_TAG,ns,"entry");
- Stringtitle=null;
- Stringsummary=null;
- Stringlink=null;
- while(parser.next()!=XmlPullParser.END_TAG){
- if(parser.getEventType()!=XmlPullParser.START_TAG){
- continue;
- }
- Stringname=parser.getName();
- if(name.equals("title")){
- title=readTitle(parser);
- }elseif(name.equals("summary")){
- summary=readSummary(parser);
- }elseif(name.equals("link")){
- link=readLink(parser);
- }else{
- skip(parser);
- }
- }
- returnnewEntry(title,summary,link);
- }
- //Processestitletagsinthefeed.
- privateStringreadTitle(XmlPullParserparser)throwsIOException,XmlPullParserException{
- parser.require(XmlPullParser.START_TAG,ns,"title");
- Stringtitle=readText(parser);
- parser.require(XmlPullParser.END_TAG,ns,"title");
- returntitle;
- }
- //Processeslinktagsinthefeed.
- privateStringreadLink(XmlPullParserparser)throwsIOException,XmlPullParserException{
- Stringlink="";
- parser.require(XmlPullParser.START_TAG,ns,"link");
- Stringtag=parser.getName();
- StringrelType=parser.getAttributeValue(null,"rel");
- if(tag.equals("link")){
- if(relType.equals("alternate")){
- link=parser.getAttributeValue(null,"href");
- parser.nextTag();
- }
- }
- parser.require(XmlPullParser.END_TAG,ns,"link");
- returnlink;
- }
- //Processessummarytagsinthefeed.
- privateStringreadSummary(XmlPullParserparser)throwsIOException,XmlPullParserException{
- parser.require(XmlPullParser.START_TAG,ns,"summary");
- Stringsummary=readText(parser);
- parser.require(XmlPullParser.END_TAG,ns,"summary");
- returnsummary;
- }
- //Forthetagstitleandsummary,extractstheirtextvalues.
- privateStringreadText(XmlPullParserparser)throwsIOException,XmlPullParserException{
- Stringresult="";
- if(parser.next()==XmlPullParser.TEXT){
- result=parser.getText();
- parser.nextTag();
- }
- returnresult;
- }
- ...
- }
跳过无用的标签
- privatevoidskip(XmlPullParserparser)throwsXmlPullParserException,IOException{
- if(parser.getEventType()!=XmlPullParser.START_TAG){
- thrownewIllegalStateException();
- }
- intdepth=1;
- while(depth!=0){
- switch(parser.next()){
- caseXmlPullParser.END_TAG:
- depth--;
- break;
- caseXmlPullParser.START_TAG:
- depth++;
- break;
- }
- }
- }
使用xml数据
- publicclassNetworkActivityextendsActivity{
- publicstaticfinalStringWIFI="Wi-Fi";
- publicstaticfinalStringANY="Any";
- privatestaticfinalStringURL="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest";
- //WhetherthereisaWi-Ficonnection.
- privatestaticbooleanwifiConnected=false;
- //Whetherthereisamobileconnection.
- privatestaticbooleanmobileConnected=false;
- //Whetherthedisplayshouldberefreshed.
- publicstaticbooleanrefreshDisplay=true;
- publicstaticStringsPref=null;
- ...
- //UsesAsyncTasktodownloadtheXMLfeedfromstackoverflow.com.
- publicvoidloadPage(){
- if((sPref.equals(ANY))&&(wifiConnected||mobileConnected)){
- newDownloadXmlTask().execute(URL);
- }
- elseif((sPref.equals(WIFI))&&(wifiConnected)){
- newDownloadXmlTask().execute(URL);
- }else{
- //showerror
- }
- }
动态下载xml
- //ImplementationofAsyncTaskusedtodownloadXMLfeedfromstackoverflow.com.
- privateclassDownloadXmlTaskextendsAsyncTask<String,Void,String>{
- @Override
- protectedStringdoInBackground(String...urls){
- try{
- returnloadXmlFromNetwork(urls[0]);
- }catch(IOExceptione){
- returngetResources().getString(R.string.connection_error);
- }catch(XmlPullParserExceptione){
- returngetResources().getString(R.string.xml_error);
- }
- }
- @Override
- protectedvoidonPostExecute(Stringresult){
- setContentView(R.layout.main);
- //DisplaystheHTMLstringintheUIviaaWebView
- WebViewmyWebView=(WebView)findViewById(R.id.webview);
- myWebView.loadData(result,"text/html",null);
- }
- }
加载xml
- //UploadsXMLfromstackoverflow.com,parsesit,andcombinesitwith
- //HTMLmarkup.ReturnsHTMLstring.
- privateStringloadXmlFromNetwork(StringurlString)throwsXmlPullParserException,IOException{
- InputStreamstream=null;
- //Instantiatetheparser
- StackOverflowXmlParserstackOverflowXmlParser=newStackOverflowXmlParser();
- List<Entry>entries=null;
- Stringtitle=null;
- Stringurl=null;
- Stringsummary=null;
- CalendarrightNow=Calendar.getInstance();
- DateFormatformatter=newSimpleDateFormat("MMMddh:mmaa");
- //Checkswhethertheusersetthepreferencetoincludesummarytext
- SharedPreferencessharedPrefs=PreferenceManager.getDefaultSharedPreferences(this);
- booleanpref=sharedPrefs.getBoolean("summaryPref",false);
- StringBuilderhtmlString=newStringBuilder();
- htmlString.append("<h3>"+getResources().getString(R.string.page_title)+"</h3>");
- htmlString.append("<em>"+getResources().getString(R.string.updated)+""+
- formatter.format(rightNow.getTime())+"</em>");
- try{
- stream=downloadUrl(urlString);
- entries=stackOverflowXmlParser.parse(stream);
- //MakessurethattheInputStreamisclosedaftertheappis
- //finishedusingit.
- }finally{
- if(stream!=null){
- stream.close();
- }
- }
- //StackOverflowXmlParserreturnsaList(called"entries")ofEntryobjects.
- //EachEntryobjectrepresentsasinglepostintheXMLfeed.
- //ThissectionprocessestheentrieslisttocombineeachentrywithHTMLmarkup.
- //EachentryisdisplayedintheUIasalinkthatoptionallyincludes
- //atextsummary.
- for(Entryentry:entries){
- htmlString.append("<p><ahref='");
- htmlString.append(entry.link);
- htmlString.append("'>"+entry.title+"</a></p>");
- //Iftheusersetthepreferencethttp://oincludesummarytext,
- //addsittothedisplay.
- if(pref){
- htmlString.append(entry.summary);
- }
- }
- returnhtmlString.toString();
- }
- //GivenastringrepresentationofaURL,setsupaconnectionandgets
- //aninputstream.
- privateInputStreamdownloadUrl(StringurlString)throwsIOException{
- URLurl=newURL(urlString);
- HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
- conn.setReadTimeout(10000/*milliseconds*/);
- conn.setConnectTimeout(15000/*milliseconds*/);
- conn.setRequestMethod("GET");
- conn.setDoInput(true);
- //Startsthequery
- conn.connect();
- InputStreamstream=conn.getInputStream();
- }
上面的片段代码为了帮助大家理解,这里还是老习惯,贴上项目的源代码,本来是有项目截图,运行效果图之类的图的,只是这篇文章太长了,再弄图片,就更占篇幅了,所以就只贴源码了,大家可以自己的运行起来看看,希望能从整体的架构和具体的代码细节上帮助到大家。点击打开下载链接
相关推荐
罗列了android常用两种检测网络方法,在工作线程中定时执行检测操作
从网络异步加载图片资源,主线程执行ui操作,工作线程执行耗时操作。并可对图片触摸放大缩小。
这是一个专用于解决Android中网络请求及图片加载的缓存处理框架 项目目标 本项目是作为实验项目,不保证其稳定性及可靠性 因为缓存业务的复杂性,本项目尽可能适应更多的使用场景 目前考虑到的,会实现的功能清单,...
异步任务AsyncTask执行耗时任务-音乐的收藏(使用到数据库)操作及音乐的搜索等需要访问网络的操作; 自定义view实现圆形专辑图片,滚动歌词,支持下拉刷新的音乐列表; Json解析网络响应,正则表达式解析歌词; ...
RxAndroid配合MVP模式,执行网络操作并更新ui的demo
iPerf3是一个用于测量网络带宽性能的开源工具。它被设计用于评估网络连接的吞吐量、延迟和数据包丢失率等性能指标。以下是关于iPerf3的一些重要信息和功能: ...跨平台支持:iPerf3可在多种操作系统上运行,包括Lin
实现Runnable接口,实际下载工作,负责网络请求,数据库信息更新 DownloadManager 单例,创建下载任务,提供获取正在下载任务,所有下载信息,设置监听器等接口 DownloadEngine 负责创建线程池,根据任务创建...
没有其他库提供简单的界面来执行网络中的所有类型的事情,例如设置优先级,取消等。 由于使用 ,因此android应用程序中不会再有GC开销。 可以在分配内存时处理GC开销。 做了一些聪明的事情来节省CPU和内存。 它使用...
这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 开 放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了...
网络通信在Android上的重要性就不多说了。...1、在同一个项目中,我们要执行网络操作可定不想要每次都编写一遍HTTP请求的代码。通常情况我们都会将这些网络操作提取到一个公共的类里面,并提供一个静态方法,
由于Android 1.0是一个正在兴起的全新手机操作系统,所以当前支持它的手机还不多。和任何其他产品早期的发行版一样,Android的软件和开发库还会经历很多正常的改进和完善。本书的内容和示例提供了如何使用当前SDK...
4)运行androidvncserver,在手机的“终端”执行以下代码: 如下指定键盘和触摸屏设备,以免找不到kdb设备: ./androidvncserver -k /dev/input/event0 -t /dev/input/event1 这样androidvncserver就启动...
Android 有丰富的功能,因此很容易与桌面操作系统混淆。Android 是一个分层的环境,构建在 Linux 内核的基础上,它包括丰富的功能。UI 子系统包括: •窗口 •视图 •用于显示一些常见组件(例如编辑框、列表和下拉...
解决:Volley就是为解决这些而生,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程...
学习为企业系统构建数据驱动的...◆ 通过避免在Internet上执行CRUD操作来提高性能 ◆ 开始编写连接到Android的后端云服务 ◆ 介绍新的开源和通用同步框架(专门与Android API集成) ◆ 解决应用程序实现中的安全问题
2.2.2 秘诀3:强制执行单任务模式 26 2.2.3 秘诀4:强制屏幕方向 26 2.2.4 秘诀5:保存和恢复activity信息 27 2.3 多个activity 28 2.3.1 秘诀6:使用按钮和文本框 28 2.3.2 秘诀7:通过事件启动另外一个activity...
Android是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • ...
Android中通过子线程连接网络获取资料,同时显示加载进度对话框给用户的操作
Android Shell工具类,可用于检查系统root权限,并在shell或root用户下执行shell命令。如: checkRootPermission() 检查root权限 execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) shell...