Java Android开发RSS源不起作用
我正在读首本Android开发书籍,这是一本很棒的书,但我在第二章第2章,我无法让这个RSS应用程序工作。因此,基本上,这不应该是最终版本,但到目前为止,它应该做的只是将应用程序显示为空。听起来很愚蠢,但它不应该显示任何内容,因为我必须为应用程序设置一些权限,以便允许应用程序连接到internet并下载RSS信息。我正在为这个应用程序处理4个不同的文件,但显然,项目中有更多的文件 我制作了一个谷歌文档文件夹,这样每个人都可以看到并下载它。我用了Eclipse 请帮助我这是一本greap的书,但在我找到解决方案之前,我无法翻到下一章 再一次,这不是最终版本,应用程序应该被视为空的,因为我需要为它设置一些权限。它给我错误,请帮助我 我遇到的主要问题是这条线路,它说iotdHandler无法解决。我不知道为什么这本书说我不应该大写这个词,因为我应该喜欢IotdHandler,但它仍然给了我错误。我把书上的一切都看了。救救我Java Android开发RSS源不起作用,java,android,xml,compiler-errors,rss,Java,Android,Xml,Compiler Errors,Rss,我正在读首本Android开发书籍,这是一本很棒的书,但我在第二章第2章,我无法让这个RSS应用程序工作。因此,基本上,这不应该是最终版本,但到目前为止,它应该做的只是将应用程序显示为空。听起来很愚蠢,但它不应该显示任何内容,因为我必须为应用程序设置一些权限,以便允许应用程序连接到internet并下载RSS信息。我正在为这个应用程序处理4个不同的文件,但显然,项目中有更多的文件 我制作了一个谷歌文档文件夹,这样每个人都可以看到并下载它。我用了Eclipse 请帮助我这是一本greap的书,但在
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IotdHandler handler = new IotdHandler();
handler.processFeed();
resetDisplay(iotdHandler.getTitle(), iotdHandler.getDate(), iotdHandler.getImage(), iotdHandler.getDescription());
}
此代码来自mainActivity.java文件
请帮帮我,它快把我逼疯了
谢谢嘿,老兄,我感觉到了你的痛苦,我花了两天的时间在那一章中找出了漏洞的解决方案。 首先也是最重要的是,这不是这本书的最终版本,它充满了错误,所以不要感到难过,并记住这一点 强文本 以下是解决您问题的方法 关于mainActivity.java
package com.example.nasadailyimage;
import android.iotdHandler;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.TextView;
公共类MainActivity扩展了活动{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IotdHandler handler = new IotdHandler(); //create handler
handler.processFeed(); //start parsing
resetDisplay(iotdHandler.getTitle(), iotdHandler.getDate(),
iotdHandler.getImage(), iotdHandler.getDescription());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void resetDisplay(String title, String date, String imageUrl, String description)
{
TextView titleView = (TextView)findViewById(R.id.imageTitle);
titleView.setText(title);
TextView dateView = (TextView)findViewById(R.id.imageDate);
dateView.setText(date);
ImageView imageView = (ImageView)findViewById(R.id.imageDisplay);
Bitmap image = null;
imageView.setImageBitmap(image);
TextView descriptionView = (TextView)findViewById(R.id.imageDescription);
descriptionView.setText(description);
}
}
第二:您需要在src文件夹中创建一个名为IotdHandler.java的文件。
在这个文件中,您需要创建以下Getter方法
package android;
public class iotdHandler {
public static String getDate() {
// TODO Auto-generated method stub
return null;
}
public static String getTitle() {
// TODO Auto-generated method stub
return null;
}
public static String getImage() {
// TODO Auto-generated method stub
return null;
}
public static String getDescription() {
// TODO Auto-generated method stub
return null;
}
}
尽我所能主要问题是首席作者在对象命名方面有点不连贯 声明的对象未被使用。IotdHandler制造,IotdHandler 习惯于java和android都是区分大小写的。 有时方法的签名参数与此不同 声明的方法的名称。就像它应该是字符串,字符串,位图, StringBuffer,但调用方使用String,String,String,String。
我建议您阅读Wrox或Apress android书籍进行编程练习,然后采用HeadFirst编码思想,以获得健壮的代码。您必须在mainactivity.java中调用resetDisplay方法的地方进行以下更正
package com.example.nasadailyimage;
import android.iotdHandler;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.TextView;
我知道这篇文章已经很老了,但我的回答可能会帮助下一个可能在这里找到自己的人,特别是因为没有公认的答案 如前所述,这本书充满了错误,可以让android和java的新手,像我一样,有点疯狂。经过几天的谷歌搜索和阅读,我已经设法让这个工作,所以这里去 我不确定OP使用的是哪个版本的android,但我认为书中代码的一个问题是添加了蜂巢3.x及以上版本,不允许在UI线程上进行可能昂贵的操作。了解更多信息:
http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html
对于这个问题,您需要使用ASyncTask在单独的线程上运行可能代价高昂的操作
请注意,在捕获异常的代码中,我只是将异常错误打印到titleView文本视图,以便更容易地找出问题所在
在异步任务中运行代码完成后,更新显示
startElement方法似乎也不正确,因为如果您在XML编辑器中查看RSS源的详细信息,则图像所需的URL在附件中
我的代码如下,如有任何问题,请留言;请注意,我也是一个初学者,所以可能有更好的方法
package neill.nasadailyimage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import android.support.v7.app.ActionBarActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
public class NasaDailyImage extends ActionBarActivity
{
IotdHandler handler = new IotdHandler(); // Create handler
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nasa_daily_image);
handler.processFeed();
}
public void ResetDisplay() {
String title = handler.getTitle();
String date = handler.getDate();
String description = handler.getDescription().toString();
resetDisplay(title, date, handler.getImage(), description);
}
private void resetDisplay(String title, String date, Bitmap image, String description)
{
try {
TextView titleView = (TextView) findViewById(R.id.imageTitle);
titleView.setText(title);
TextView dateView = (TextView)findViewById(R.id.imageDate);
dateView.setText(date);
ImageView imageView = (ImageView)findViewById(R.id.imageDisplay);
imageView.setImageBitmap(image);
TextView descriptionView = (TextView)findViewById(R.id.imageDescription);
descriptionView.setText(description);
} catch (Exception e) {
TextView titleView = (TextView) findViewById(R.id.imageTitle);
titleView.setText(e.toString());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.nasa_daily_image, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class IotdHandler extends DefaultHandler
{
private String url = "http://www.nasa.gov/rss/image_of_the_day.rss";
private boolean inTitle = false;
private boolean inDescription = false;
private boolean inItem = false;
private boolean inDate = false;
private Bitmap image = null;
private String title = null;
private String date = null;
private StringBuffer description = new StringBuffer();
public XMLReader reader = null;
private Bitmap getBitmap(String url)
{
try
{
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
input.close();
return bitmap;
}
catch (IOException ioe)
{
TextView titleView = (TextView) findViewById(R.id.imageTitle);
titleView.setText(ioe.toString());
return null;
}
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if (localName.equals("enclosure")) {
image = getBitmap(attributes.getValue("url").toString());
}
if (localName.startsWith("item")) { inItem = true; }
else
{
if (inItem) {
if (localName.equals("title")) { inTitle = true; }
else { inTitle = false; }
if (localName.equals("description")) { inDescription = true; }
else { inDescription = false; }
if (localName.equals("pubDate")) { inDate = true; }
else { inDate = false; }
}
}
}
public void characters(char ch[], int start, int length)
{
String chars = (new String(ch).substring(start, start + length));
if (inTitle && title == null) { title = chars; }
if (inDescription) { description.append(chars); }
if (inDate && date == null) { date = chars; }
}
private class ProcessFeedTask extends AsyncTask<String, Void, InputStream>
{
@Override
protected InputStream doInBackground(String... params)
{
String url = params[0];
InputStream inputStream = null;
try
{
inputStream = new URL(url).openStream();
reader.parse(new InputSource(inputStream));
}
catch (Exception e)
{
TextView titleView = (TextView) findViewById(R.id.imageTitle);
titleView.setText(e.toString());
}
return inputStream;
}
@Override
protected void onPostExecute(InputStream result)
{
super.onPostExecute(result);
if (result != null) {
ResetDisplay();
}
}
}
public void processFeed()
{
try
{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
reader = parser.getXMLReader();
reader.setContentHandler(this);
new ProcessFeedTask().execute(url);
}
catch (Exception e)
{
TextView titleView = (TextView) findViewById(R.id.imageTitle);
titleView.setText(e.toString());
}
}
public String getTitle() { return title ; }
public String getDate() { return date ; }
public String getDescription() { return description.toString() ; }
public Bitmap getImage() { return image ; }
}
}
如果你在模拟器中运行代码,给它一点时间,我认为模拟器的网速相当慢
希望这能帮助别人
干杯
尼尔忘了RSS源。请再次核对你的答案.不要浪费别人的时间