android学习笔记之(五)

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

在本章中,您将移动过去的基础知识,松开皮带,让Android的腿伸展一点。越来越多的移动软件领域的进步,它是越来越少了可能使应用程序不依赖于网络上的严重。在许多方面,全功能的互联网接入已经成 为移动世界的要素之一。的深度和Android的网络层广度使其无法塞入同一个小书一小章。考虑到这一点,我会尽力,因为我以前,武装你的基本需要,使生 产级应用程序。在这个过程中,如前面的例子,你将探索Android的技术,数切件。

与要素开始,你将学习如何使用一个简单的HTTP连接下载,分析,并列出了一个远程XML file.These元素中的元素示例应用程序,将互联网广播在基本的XML文件中包含的车站。事实上,整个示例应用程序将集中在建立一个简单的互联网电 台播放。可悲的是,Android的流式音频状态不会辜负它的文件。因此,本章将更多的是锻炼和功能完备的应用较少。

从Web加载一个列表

为了使您的时髦的示例应用程序,你需要获取,分析和显示广播电台简单列表。这样就要求我覆盖了从HTTP交易主体范围ListViews。拉下一 列的从网络和屏幕上显示他们是我发现自己,作为一个在许多移动项目工程师,做了近constantly.From拆一“好友名单上的社会网络,以”高评分 名单“,”从在线游戏元素,还有一些有关下载普遍,分析,并展示了list.Although我知道你可能不会作出流音乐应用

很快,这个例子足以普遍认为应作为两个基本的网络操作和处理选择菜单指导。另外值得注意的是,您要执行同样的任务,几乎可以与自定义小部件的工 作在第3章回一样。坦率地说,我不知道这种方法是一个整体得多,但也许那是因为我用在一个相当简陋的手法已经错过了较为复杂的比特这将有助于一些。在任何 情况下,足够gabbing,让我们进入了网络连接的基本知识。

第一事情...第一页?

你的首要任务将是拉XML文件送到服务器上。我做了一个简单的XML示例文件(其中,在您的最终应用,将由一个PHP脚本或一个Java Servlet提供)和我的网站上托管这个site.Before我们得到任何进一步的,我将列出几个变量声明你将需要更高版本。两个网络连接,并为我们 的最终选择列表,代码清单5-1显示了类声明和变量转储。

Code Listing 5-1. Essential Class Variables

public class StationPicker extendsActivity {

//Uncomment the next lines after we've

//defined the StationData class

//Vector<StationData> stationListVector =

//new Vector<StationData>();

SAXParser parser = null;

XMLReader reader = null;

//You'll have to check the code for the following line.

//XMLHandler handler = new XMLHandler();

ArrayAdapter<StationData> adapter = null;

你在前面看到的是上市对象的自助餐,您需要完成你的小示例应用程序。您有矢量举行电台列表,SAX解析器,一个读者,和一个XML解析处理。最后你有ArrayAdapter,其中,在某些时候,你会与元素填充使你的屏幕菜单。

此外,代码事情是如何在你的OnCreate函数初始化5-2显示。

Code Listing 5-2. Setting Up for XML Parsing

{

super.onCreate(icicle);

try

{

//This can be just about

//anything at this point

setContentView(R.layout.main);

SAXParserFactory f =

SAXParserFactory.newInstance();

parser = f.newSAXParser();

reader = parser.getXMLReader();

reader.setContentHandler(handler);

//We'll get to the contents of the

//following function later.

// If you're following along

//just stub it to return null

initList();

}

catch (Exception e)

{

Log.e("StationPicker", "Parser FAIL!");

}

}

再次,因为我假定你使用Java舒服,我不会走,通过所有必需的步骤。如果你想全面情况和相关的代码,请随时抓住项目线上。至于initList方法,我将定义在后面的章节。现在,如果你沿后,您可以按照注释的意见和存根它返回null。

获取网络在齿轮

我 当选为揭开序幕,在内部ListActivity OnStart方法的网络连接。通常你可能会这样做一次,然后在启动时,使用的意图,移动到一个新的活动为显示列表。但为了保持一个尽可能简单,我会尽量 做我可以在单一的活动,例如为了。它会阻止必须处理的管理你的意图,这也会给我一个机会,向您展示如何使用UI线程。您将了解更多有关,后来,就目前而 言,网络!见代码清单5-3。

Code Listing 5-3. Creating and Using a Simple HTTP Connection

public void onStart()

{

super.onStart();

Thread t = new Thread()

{

public void run()

{

HttpUriRequest request = null;

HttpResponse resp = null;

InputStream is = null;

DefaultHttpClient client =

new DefaultHttpClient();

try{

//Build the request

request =

new HttpGet(

"http://www.wanderingoak.net/stations.xml");

//Execute it using the default

//HTTP Client settings;

resp = client.execute(request);

//Pull out the entity

HttpEntity entity= resp.getEntity();

//Snag the response stream from the entity

is = entity.getContent();

//Parse the incoming data

reader.parse(new InputSource(is));

} catch (Exception e)

{

Log.e("LoadStations","FAIL!");

}

}

};

t.start();

}

首先需要一个 DefaultHttpClient 实例。您可以通过简单地创建新的它这一点。接下来,您将创建一个新的HttpGet对象,在你的XML饲 料的位置通过。然后,您可以执行您的新请求对象上的默认客户端的HTTP请求。这是一个阻塞操作(因此新的线程),而一旦执行方法返回,你可以得到 HttpEntity。出于这种对象,你可以检索的InputStream载有反应机构。

如果最后读者呼吁是没有意义的你所有,是因为它不应该,因为我还没有告诉你什么也没有。是的,我知道你的示例代码将无法编译没有它。等一下,我将得到这一点。

注:DefaultHttpConnection对象似乎线轴和运行至少在当前版本的模拟器,令人发指的缓慢。你或许可以找同HttpClient的类的各种子修补更好的性能。您的里程可能会有所不同,但如果你需要的概念演示,默认一个快速简便的证据可能是要走的路。

把它放置数据

正如你可以看到前面的代码,拆从服务器或任何数据的XML数据位的这个问题,是一个非常简单的过程。这reader.parse线一 直缠着你,我的是一个简单的调用一个SAX解析器。出了门卷Android与一些XML解析器的选择,既然我假定你舒适与Java和为了节省时间,我不会拼写你出 来。

如果你绝对必须知道发生了什么,欢迎您来获取示例代码,并检查它。然而现在,这足以知道分析器填补了StationData对象矢量充分。代码定义5-4所示。

Code Listing 5-4. Defining the Data-Housing Class

class StationData

{

public String title = "";

public String url = "";

public String toString()

{

return title;

}

}

为了简单起见 我避免了界定私人 getter setter 方法弦乐元素共同封装的做法。相反,您只需在类访问的元素直接。如果你是一个C / C + +程序员,这更像是一个“结构比”阶级“好色”。利用这个toString方法特别留意。它可能看起来没有用在这个时候,主要是因为它现在是正确的,但其 功能将变得更加用几段明显。每一个从XML文件站将获得自己的StationData对象。同样,只为例子起见,代码5-5显示了在单台的XML元素的外观。

<xml>

<stationList>

<station>

<title>Pop Rock Top 40</title>

<audioUrl>

http://scfire-nyk-aa02.stream.aol.com:80/stream/1074

</audioUrl>

</station>

</stationList>

</xml>

因为 在这一点上 你让 XML 解析器采取与该 reader.parse 线来处理 您就可以与您的选择使元素列表。您的解析器将填补与一些元素的StationData载体。您今后几年的任务是拉出来的载体和在屏幕上放置的方式,用户可以与它们进行交互。

制作一个列表和检查它...

让您的列表菜单功能正常将需要几个步骤。您首先必须将您的活动一ListActivity和做所有的家务的交换机的 需求。接下来,您会从实际插入载体你以前建成的元素。最后,你会作出反应的事件,并开始选择一些理论音频流。同样,在此应用程序的生产版本,您可能会使用 一个以上的活动,但为简单起见,您只需一个可容纳这一切。

安装:拥抱名单

你的首要任务,如果你想显示的车站选择清单,将您的单调的活动,一个全新的ListActivity。下面是在其新的原始形式的类声明:

public class StationPicker extends ListActivity

这种转换也带有一些显着的责任。如果你不履行这些义务,Android将抛出一个异常的you.First一堆,您需要添加到该ListView的默认布局文件,因为每个ListActivity必须有一个相关的ListView。下面是例子 main.xml 如下所示

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=

"http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Loading Stations..."

android:id="@+id/loadingStatus"

/>

<ListView android:id="@+id/android:list"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

/>

</LinearLayout>

添加适配器

其次 你需要添加一个适配器到列表控件。您需要定义每个元素是将会是什么样的。你会做一个简单的XML文件包含一个单一的文本元素。称之为list_element.xml,它应该像代码5-6。

Code Listing 5-6. res/layout/list_element.xml

<?xml version="1.0" encoding="utf-8"?>

<TextView id="@+id/textElement"

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content"/>

这TextView介绍,到Android,什么列表中的每个元素应该像。这是字体的地方,彩色文本和背景资源。更复杂的列表元素是可能的,但我会为这一变化得到一点点以后。

请记住,initList方法,我告诉你存根提早出门?而不是返回null,代码5-7是它应该像。

Code Listing 5-7. Must Do: Adding an Adapter to the ListView

privatevoid initList()

{

adapter = new ArrayAdapter<StationData>(

StationPicker.this, R.layout.list_element);

setListAdapter(adapter);

}

每个 ListView 中必须有一个相应的适配器。适配器在数大小和口味。表 5-1 给出了其中最重要的简要说明。

现在,你有一个充分发挥作用,而十分丑陋,菜单列表准备就绪。现在你需要的是一些数据!

填充到数据适配器

放置在适配器的数据很简单,但有一点:它必须采取

地方内的UI线程。什么,你可能会问,我说什么?用户界面线程是执行特 定线程,它控制重绘loop.You会发现,如果您启动一个新的通用Java线程,然后尝试改变当前视图,数据元素添加到列表适配器,或任何其他UI任 务,Android将得到真正与你脾气暴躁。由脾气暴躁,我的意思是行不通的,或者它会抛出一大堆对你例外。

回收的UIThread

既然你开始一个新的内嵌Java线程来处理您的阻塞网络连接,您现在必须定义一个“可运行”,进入用户界面的神的青睐回来。谢天谢地,活动包含调度,UI线程代码的方法。您将它添加到你的网络代码底部(见代码清单5-8)。我将重复的情况下最后几行。

Code Listing 5-8. Recovering the UI Thread

Thread t = new Thread()

{

//---------

//Skipping a bunch of

//Code here

reader.parse(new InputSource(is));

//Run our code on the UI Thread.

UIThreadUtilities.runOnUIThread(

StationPicker.this,r);

注意:不要尝试将其粘贴到您的项目前面的代码并编译它只是还没有。您需要定义该对象的第一个可运行?。熊我只几分钟,或段落,这取决于你读的速度有多快。

UIThreadUtilities的对象主要是一个静态类,它是活动的一员。你必须在一个上下文对象传递给runOnUIThread,而且由于这是对 你当前正在运行的线程,而不是你的ListActivity指针,你必须抓住你ListActivity(一类语境从 StationPicker.this.That)规例引用是一个“可运行”,你将定义在短短一分钟。

最后,添加数据

你终于可以开始铲到您的ArrayListAdapter StationData元素。你会做内部的可运行?对象,你听我谈谈刚才(代码5-9)。

Code Listing 5-9. Adding Elements to the Adapter

Runnable r = new Runnable()

{

public void run()

{

TextView t =

(TextView) findViewById(

R.id.loadingStatus);

t.setText("Stations Loaded");

try{

for(int i=0;

i < stationListVector.size();

i++)

adapter.addObject(

stationListVector.elementAt(i));

}catch (Exception e) {}

getListView().invalidate();

}

};

因为您现在的UI线程,有可能修改的装载状态文本的内容。一旦你改变了状态信息,就可以开始添加元素的ArrayAdapter。您只需遍历矢量的大小和 每个项目添加到该适配器。如何,你可能会问,是否知道什么列表元素的文本插入到TextView是由列表中的每个视觉元素?简单,回顾toString方 法是您在StationData类推翻了。在建立这一名单时,ArrayAdapter呼吁数组中的每个文字的屏幕上显示该元素的toString。

选择...

您现在有一个功能,选择广播电台列表!当然,你没有做任何项目时被选中,所以你必须做些事情。值得庆幸的是ListView的与ListActivity紧密集成使这变得轻而易举。简单地重写保护的方法:

protectedvoid onListItemClick(

ListView l, View v, int position, long id)

{

StationData selectedStation =

stationListVector.elementAt(position);

MediaPlayer player = new MediaPlayer();

try

{

player.setDataSource(selectedStation.url);

player.start();

}

catch (Exception e)

{

Log.e("PlayerException", "SetData");

}

}

我已经包含的音频代码,就可以告诉我,按照正确的文件。仅仅因为文件说,它的作品,但不,意味着它实际上是可行的。事实上,以前的代码,它链接到一个Shoutcast一样MP3链接,不抛出异常,但不播放。我只能希望解决这个Android工程师申请前发射问题。

有积极的辩论和大量的代码,例如在Web上运行周围。与谷歌的搜索引擎没有工作将展开的哈克多种变通办法。

注意没有出路的示例应用程序:我有没有做任何有用的错误处理。主要是我会捕捉异常并打印东西一log.Your最终的移动应用程序将需要有关错误比我目前,因为相信我,在手机可以有点接触网络时走。

下一步行动

本章的最后一步是给ListView的一个小panache.You'当地雇员要添加一个背景,整个屏幕。这样做应该有点熟悉,因为你已经这样做了,然后从前面的例子

(见代码5-10)。

Code Listing 5-10. Linear Layout XML Block Inside Main.xml

<LinearLayout xmlns:android=

"http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@drawable/bg"

@ drawable / 血糖是指当然 内部的图像 / 水库 / drawable / 目录。您还需要调整名单部件宽度

<ListView android:id="@+id/android:list"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

/>

这将防止改变大小的元素,而我认为你可以同意元素的菜单元素,看起来非常可怕。设置列表视图布局的宽度或高度的wrap_content导致它包裹单独每个菜单项。进入数字。

穿衣戴帽菜单

还 有一个更重大的改变你可以对菜单会给你比呈现it.Android更多的控制使您,当定义为适配器的UI元素,指定一个大菜单项对象,然后指向一个 TextView内您要编辑。在此之前,你会指向一个单一的,预定义TextView。代码清单5-11显示了新的列表元素布局文件的样子。

Code Listing 5-11. The New and Improved list_element.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=

"http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="22dip

android:background="@drawable/listbg"

<TextView android:id="@+id/textElement"

xmlns:android=

"http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:textAlign="center"

/>

</LinearLayout>

在此代码 您添加了一些具体方面的线性布局。

还赋予它的背景 listbg.png 。有趣的是,Android将重新缩放你的背景图片以适合计算的背景大小的空间。你可能想知道,如果你已经做好了准备工作,为 什么您使用的是线性布局而不是仅仅是添加背景和前案文方面。你正在做只是为了这个原因,示范。我想你,当你提出申请,这比我好,看看如何复杂的清单可以放 在一起。在我总结,有一个更多的代码,您需要更新,使这个改变路线。这是在initList方法

private void initList()

{

adapter = new ArrayAdapter<StationData>(

StationPicker.this, R.layout.list_element,

R.id.textElement);

...............

setListAdapter(adapter);

}

在前面的适配器初始,只有指定的布局element.Now你需要指向在/ res文件/文件夹/包含更复杂的列表元素,以及一个指针,Android放置文本的告诉拉该StationData对象的toString功能。

现在,如果你所做的一切正确的(或你欺骗和下载示例文件),你应该看到类似图5-1布局看。

坦率地说,我非常糟糕平面设计师才干,这个用户界面的版本不能说是很漂亮。它可能还不能称为好。问题不在于使我对图形设计意识薄弱的乐趣,虽然你那么很欢迎这样做。问题是,这个例子告诉你应该如何使您的应用程序看起来比我更好的例子。现在您可以使用几乎任何兴建此菜单。

回顾

在本章中,你有机会,让Android伸展的腿一点点。我完成了基本的网络,一些更深入的界面布局,和一点点XML解析启动。

在HTTP层 是简单,易于使用在这一点上,尽管繁琐和缓慢的(至少在OS X的模拟器)。Android显然有能力钻研代理,饼干,插座级连接,更先进的网络富。您可以进入下载数据,使用XML数据,并使用SAX解析器的东西,会成为一 个载体。从这个载体,您建立了一个,当一个项目被选中,成为一些飘带理论媒体发起的清单。可悲的是,流媒体功能,不辜负它的文件,但随着时间的推移,这是 应该予以纠正。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值