1

我正在为 android 4.0+ 创建一个 RSS 阅读器应用程序。由于 NetworkOnMainThreadException,我已将阅读器代码放在 AsyncTask 中。该代码几乎可以正常工作,但是一行有错误。这是我的代码:

Java代码:

   private class PostTask extends AsyncTask<String, Integer, String> {
   @Override
   protected void onPreExecute() {
   super.onPreExecute();
   }

   @Override
   protected String doInBackground(String... params) {
  String url=params[0];
   headlines = new ArrayList();
   links = new ArrayList();

   //Download and parse xml feed
   headlines = new ArrayList();
   links = new ArrayList();

   try {
    URL url1 = new URL("http://feeds.pcworld.com/pcworld/latestnews");

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(false);
    XmlPullParser xpp = factory.newPullParser();

           // We will get the XML from an input stream
    xpp.setInput(getInputStream(url1), "UTF_8");

           /* We will parse the XML content looking for the "<title>" tag which appears inside the "<item>" tag.
            * However, we should take in consideration that the rss feed name also is enclosed in a "<title>" tag.
            * As we know, every feed begins with these lines: "<channel><title>Feed_Name</title>...."
            * so we should skip the "<title>" tag which is a child of "<channel>" tag,
            * and take in consideration only "<title>" tag which is a child of "<item>"
            *
            * In order to achieve this, we will make use of a boolean variable.
            */
    boolean insideItem = false;

           // Returns the type of current event: START_TAG, END_TAG, etc..
    int eventType = xpp.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG) {

            if (xpp.getName().equalsIgnoreCase("item")) {
                insideItem = true;
            } else if (xpp.getName().equalsIgnoreCase("title")) {
                if (insideItem)
                    headlines.add(xpp.nextText()); //extract the headline
            } else if (xpp.getName().equalsIgnoreCase("link")) {
                if (insideItem)
                    links.add(xpp.nextText()); //extract the link of article
            }
        }else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
            insideItem=false;
        }

        eventType = xpp.next(); //move to next element
    }

   } catch (MalformedURLException e) {
    e.printStackTrace();
   } catch (XmlPullParserException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }

  return "Feed parsed!";
   }

   @Override
   protected void onProgressUpdate(Integer... values) {
  super.onProgressUpdate(values);
   }

   @Override
   protected void onPostExecute(String result) {
  super.onPostExecute(result);
   // Binding data
  ArrayAdapter adapter = new ArrayAdapter(this,
          android.R.layout.simple_list_item_1, headlines);
  setListAdapter(adapter);

   }
   }

在此代码段中,我收到一个错误:

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// Binding data
ArrayAdapter adapter = new ArrayAdapter(this,
          android.R.layout.simple_list_item_1, headlines);
setListAdapter(adapter);
}

错误:构造函数 ArrayAdapter(MainActivity.PostTask, int, List) 未定义。

日志猫:

01-26 20:55:53.811: E/AndroidRuntime(1830): FATAL EXCEPTION: AsyncTask #1
01-26 20:55:53.811: E/AndroidRuntime(1830): java.lang.RuntimeException: An error occured while executing doInBackground()
01-26 20:55:53.811: E/AndroidRuntime(1830):     at android.os.AsyncTask$3.done(AsyncTask.java:278)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.lang.Thread.run(Thread.java:856)
01-26 20:55:53.811: E/AndroidRuntime(1830): Caused by: java.lang.IllegalArgumentException
01-26 20:55:53.811: E/AndroidRuntime(1830):     at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1615)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at com.mysoftware.mysoftwareos.mobile.MainActivity$PostTask.doInBackground(MainActivity.java:343)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at com.mysoftware.mysoftwareos.mobile.MainActivity$PostTask.doInBackground(MainActivity.java:1)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-26 20:55:53.811: E/AndroidRuntime(1830):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-26 20:55:53.811: E/AndroidRuntime(1830):     ... 5 more

有人可以调查我的问题并提出解决方案吗?或者告诉我是否应该做一些不同的事情?非常感谢!

4

2 回答 2

3

将其更改为:

ArrayAdapter adapter = new ArrayAdapter(MainActivity.this,
      android.R.layout.simple_list_item_1, headlines);

this指的是AsyncTask,所以你必须明确地引用MainActivity's this

于 2013-01-26T18:26:49.187 回答
1

使用 Activity Context 而不是 AsyncTask 在方法内创建 ArrayAdapter onPostExecute

ArrayAdapter<String> adapter = 
                      new ArrayAdapter<String>(Your_Current_Activity.this,
                      android.R.layout.simple_list_item_1, headlines);
  setListAdapter(adapter);

编辑: 日志发布后也改变

xpp.setInput(getInputStream(url1), "UTF_8");

xpp.setInput(url1.openConnection().getInputStream(), "UTF_8");
于 2013-01-26T18:27:30.217 回答