【问题标题】:Parsing XML, i have no errors, i don't know whats wrong?解析XML,我没有错误,我不知道怎么了?
【发布时间】:2014-01-14 01:50:19
【问题描述】:

我试图在我的ListView 中获取 rss 提要,然后打开每个列表行的描述。我不知道为什么我的项目关闭了。我做错了什么?

这是我的代码:

MainActivity.java

public class MainActivity extends Activity {

 // A reference to the local object
private MainActivity local;

/**
 * This method creates main application view
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set view
    setContentView(R.layout.activity_main);

    // Set reference to this activity
    local = this;

    GetRSSDataTask task = new GetRSSDataTask();

    // Start download RSS task
    task.execute("http://www.conciencia.net/rss.aspx");

}

private class GetRSSDataTask extends AsyncTask<String, Void, List<RssAtomItem> > {
    @Override
    protected List<RssAtomItem> doInBackground(String... urls) {

        try {
            // Create RSS reader
            RssAtomReader rssReader = new RssAtomReader(urls[0]);

            // Parse RSS, get items
            return rssReader.getItems();

        } catch (Exception e) {
            Log.e("ITCRssAtomReader", e.getMessage());
        }

        return null;
    }

    @Override
    protected void onPostExecute(List<RssAtomItem> result) {

        // Get a ListView from main view
        ListView itcItems = (ListView) findViewById(R.id.listMainView);

        // Create a list adapter
        ArrayAdapter<RssAtomItem> adapter = new ArrayAdapter<RssAtomItem>(local,android.R.layout.simple_list_item_1, result);
        // Set list adapter for the ListView
        itcItems.setAdapter(adapter);

        // Set list view item click listener
        itcItems.setOnItemClickListener(new ListListener(result, local));
    }
}

}

DetailsActivity.java

public class DetailsActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    String title    = (String)getIntent().getExtras().get("title");
    String author   = (String)getIntent().getExtras().get("author");
    String guid     = (String)getIntent().getExtras().get("guid");
    String description  = (String)getIntent().getExtras().get("description");


    Log.d("DEBUG", "title:\t" + title);
    Log.d("DEBUG", "author:\t" + author);
    Log.d("DEBUG", "guid:\t" + guid);
    Log.d("DEBUG", "description:\t\t" + description);


    TextView titleTV = (TextView)findViewById(R.id.detailsTextView);
    TextView titleTV2 = (TextView)findViewById(R.id.detailsTextView2);
    TextView titleTV3 = (TextView)findViewById(R.id.detailsTextView3);
    TextView titleTV4 = (TextView)findViewById(R.id.detailsTextView4);


    titleTV.setText(title);
    titleTV2.setText(title);
    titleTV3.setText(title);
    titleTV4.setText(title);


}


}

RssAtomItem.java

public class RssAtomItem {

private String title;

private String author;

private String guid;

private String description;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getGuid() {
    return guid;
}

public void setGuid(String guid) {
    this.guid = guid;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

@Override
public String toString() {
    return title;
}

}

ListListener.java

public class ListListener implements OnItemClickListener {

// List item's reference
List<RssAtomItem> listItems;
// Calling activity reference
Activity activity;

public ListListener(List<RssAtomItem> aListItems, Activity anActivity) {
    listItems = aListItems;
    activity  = anActivity;
}

public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
    Intent i = new Intent(activity, DetailsActivity.class);
    i.setData(Uri.parse(listItems.get(pos).getDescription()));

    i.putExtra("title", listItems.get(pos).getTitle());
    i.putExtra("author", listItems.get(pos).getAuthor());
    i.putExtra("guid", listItems.get(pos).getGuid());
    i.putExtra("description", listItems.get(pos).getDescription());

    activity.startActivity(i);

}

}

RssAtomParseHandler.java

public class RssAtomParseHandler extends DefaultHandler {

private List<RssAtomItem> rssItems;

// Used to reference item while parsing
private RssAtomItem currentItem;

// Parsing title indicator
private boolean parsingTitle;
// Parsing link indicator
private boolean parsingContents;
// A buffer for title contents
private StringBuffer currentTitleSb;
// A buffer for content tag contents
private StringBuffer currentContentSb;

public RssAtomParseHandler() {
    rssItems = new ArrayList<RssAtomItem>();
}

public List<RssAtomItem> getItems() {
    return rssItems;
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    if ("entry".equals(qName)) {
        currentItem = new RssAtomItem();
    } else if ("title".equals(qName)) {
        parsingTitle = true;
        currentTitleSb = new StringBuffer();
    } else if ("description".equals(qName)) {
        parsingContents = true;
        currentContentSb = new StringBuffer();
    }
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

    if ("entry".equals(qName)) {
        rssItems.add(currentItem);
        currentItem = null;
    } else if ("title".equals(qName)) {
        parsingTitle = false;

        if (currentItem != null) // There is a title tag for a whole channel present. It is being parsed before the entry tag is present, so we need to check if item is not null
            currentItem.setTitle(currentTitleSb.toString());

    } else if ("description".equals(qName)) {
        parsingContents = false;

        if (currentItem != null)
            currentItem.setDescription(currentContentSb.toString());

    }
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {

    if (parsingTitle) {
        if (currentItem != null)
            currentTitleSb.append(new String(ch, start, length));
    } else if (parsingContents) {
        if (currentItem != null)
            currentContentSb.append(new String(ch, start, length));
    }
}

}

RssAtomReader.java

public class RssAtomReader {

private String rssUrl;

/**
 * Constructor
 * 
 * @param rssUrl
 */
public RssAtomReader(String rssUrl) {
    this.rssUrl = rssUrl;
}

/**
 * Get RSS items.
 * 
 * @return
 */
public List<RssAtomItem> getItems() throws Exception {
    // SAX parse RSS data
    SAXParserFactory factory = SAXParserFactory.newInstance();

    SAXParser saxParser = factory.newSAXParser();

    RssAtomParseHandler handler = new RssAtomParseHandler();

    saxParser.parse(rssUrl, handler);

    return handler.getItems();

}

}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/backgroundm"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<ListView
    android1:id="@+id/listMainView"
    android1:layout_width="match_parent"
    android1:layout_height="590dp"
    android1:layout_alignParentTop="true"
    android1:layout_centerHorizontal="true"
    android1:layout_marginTop="125dp" >
</ListView>

</RelativeLayout>

activity_details.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/detailsTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="[POST TITLE GOES HERE]"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textStyle="bold" />

<TextView
    android:id="@+id/detailsTextView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="[POST AUTHOR GOES HERE]"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/detailsTextView3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="[POST GUID GOES HERE]"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/detailsTextView4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="[POST DESCRIPTION GOES HERE]"
    android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

这是 Logcat 所说的:

01-14 03:38:55.933: D/gralloc_goldfish(5610): Emulator without GPU emulation detected.
01-14 03:38:56.623: E/(5610): At line 8, column 71: not well-formed (invalid token)
01-14 03:38:56.633: D/AndroidRuntime(5610): Shutting down VM
01-14 03:38:56.633: W/dalvikvm(5610): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
01-14 03:38:56.653: E/AndroidRuntime(5610): FATAL EXCEPTION: main
01-14 03:38:56.653: E/AndroidRuntime(5610): java.lang.NullPointerException
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.widget.ListView.setAdapter(ListView.java:462)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at net.con.MainActivity$GetRSSDataTask.onPostExecute(MainActivity.java:75)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at net.con.MainActivity$GetRSSDataTask.onPostExecute(MainActivity.java:1)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.os.AsyncTask.finish(AsyncTask.java:631)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.os.Looper.loop(Looper.java:137)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at java.lang.reflect.Method.invokeNative(Native Method)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at java.lang.reflect.Method.invoke(Method.java:511)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-14 03:38:56.653: E/AndroidRuntime(5610):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • MainActivity 的第 73 行是什么?有东西null
  • 我看到的是:
  • 私有类 GetRSSDataTask 扩展 AsyncTask ("return null;")
  • 如果我不让它为空,我会得到一个错误
  • 因为你必须return 一些东西。但这不是第 73 行。

标签: java android xml parsing android-asynctask


【解决方案1】:

在您的 logcat 中,以下几行告诉您错误是什么

FATAL EXCEPTION: main
01-14 01:45:08.103: E/AndroidRuntime(3181): java.lang.NullPointerException

所以它是NPE...某事是null。引用您的项目的下一行会告诉您异常发生的位置

at net.con.MainActivity$GetRSSDataTask.onPostExecute(MainActivity.java:73)

所以null 位于MainActivity 的第73 行,位于GetRSSDataTaskonPostExecute() 中。

现在我们知道如何找到异常并且我们知道第 73 行是

itcItems.setAdapter(adapter);

所以您需要查看null 是什么以及可能导致此异常的原因。如果itcItems 不是null,请设置断点并查看,那么您的adapter 可能是null

既然您知道如何阅读 logcat,这将帮助您只发布最相关的代码。在这种情况下不需要其他类和 xml 文件,因为异常发生在 MainActivity 中。最初只发布最相关的代码可以更容易地在此处获得帮助。

【讨论】:

    【解决方案2】:

    您的ArrayAdapter 在尝试getCount() 时在setAdapter 中提供null Pointer Exception。这很可能是因为您在onPostExecute 中没有收到result 中的任何值

    编辑:

    onPostExecute 使用从doInBackground 返回的result,在您的情况下返回null。这意味着 result in onPostExecutenull ,您使用此 result 构建适配器,即 null ,这就是当您尝试使用 @ 设置 adapter 时得到 null pointer exception 的原因987654338@。这意味着您在try catch 块中获得了exception,因此它返回null 而不是返回rssReader.getItems();。

    【讨论】:

    • 嗯,知道了,我该如何解决?
    • 通过调试看看 try catch 块中抛出了什么错误。并张贴。那么我们将尝试解决。
    • 我再次运行了这个项目,并更新了我原来的问题 log cat 说了什么。
    • Log.e("ITCRssAtomReader", e.getMessage());曾经登录过 logcat 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2022-10-15
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多