調用resetDisplay()
方法,我知道這個職位是比較舊的,但也許我的回答將幫助旁邊的人可能在這裏找到自己,特別是因爲沒有被接受的答案。
如上所述,本書充滿了錯誤,可以讓android和java的新手像我一樣,有點瘋狂。經過幾天的谷歌搜索和閱讀,我設法讓這個工作,所以在這裏。
我不確定OP使用的是什麼版本的Android,但我認爲本書中的代碼存在的問題之一是來自Honeycomb(3.x)和以上版本的附加問題,不允許使用昂貴在UI線程上的操作。瞭解更多關於它:
http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html
對於這個問題,你需要使用的AsyncTask一個單獨的線程運行潛在的昂貴的操作。
請注意,在捕獲異常的代碼中,我只是將異常錯誤打印到titleView TextView中,以便更容易地找出問題所在。
運行完AsyncTask中的代碼後,更新顯示。
startElement方法似乎也不正確,因爲如果您在XML編輯器中查看RSS源詳細信息,則圖像所需的URL位於「enclosure」下。
我的代碼如下,請留下任何問題的意見;請注意我也是一個初學者,所以這可能是一個更好的方法。
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源。 http://www.nasa.gov/rss/image_of_the_day.rss – user2547460