简体   繁体   English

在Android上用Sax解析Xml

[英]Parsing Xml with Sax on Android

I'm trying to parse an XML from a url page. 我正在尝试从url页面解析XML To do so I have used the SAX implementation explained in this IBM example with the Adapter and other changes I got from this article . 要做到这一点我已经使用了SAX实现在解释这个IBM例如Adapter和其他的变化,我从了这篇文章 I've also tried to implement an AsyncTask to do the parsing and show a ProgressDialog but I think this is where my application starts to break down. 我还尝试实现AsyncTask来进行解析并显示ProgressDialog但我认为这是我的应用程序开始崩溃的地方。

I don't really know exactly how to implement the AsyncTask into my code, and I believe my poor implementation is causing my app to force close. 我真的不知道如何在我的代码中实现AsyncTask ,我相信我糟糕的实现会导致我的应用程序强行关闭。

MainActivity: 主要活动:

public class MainActivity extends Activity {
/** Called when the activity is first created. */
ListView lv1;
ProgressDialog ShowProgress;
public static ArrayList<MangaItem> MangaItemList = new ArrayList<MangaItem>();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lv1 = (ListView) findViewById(R.id.listView1);

    ShowProgress = ProgressDialog.show(MainActivity.this, "",
            "Loading. Please wait...", true);
    //new loadingTask().execute("http://www.mangapanda.com/alphabetical");
    new loadFeedTask().execute();

    lv1.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri
                    .parse(MangaItemList.get(position).getMangaLink()));
            startActivity(intent);

        }
    });

}

class loadFeedTask extends AsyncTask<String, Void, ArrayList<MangaItem>> {
    private String feedUrl;

    protected void onPostExecute(String s) {
        lv1.setAdapter(new EfficientAdapter(MainActivity.this, MangaItemList));
        //new MangaParserTask().execute();
        ShowProgress.dismiss();

    }

    protected ArrayList<MangaItem> doInBackground(String... params) {
        ArrayList<MangaItem> ParsedMangaItemList = new ArrayList<MangaItem>();
        feedUrl = "http://www.mangapanda.com/alphabetical"; 
        FeedParser parser = new SaxFeedParser(feedUrl);
        ParsedMangaItemList = parser.parse();
        for (MangaItem mitem : ParsedMangaItemList) {
            MangaItemList.add(mitem);
        }
        return MangaItemList;
    }


}
}

How can I properly use AsyncTask so that my parser will return an ArrayList that I can then put into an ArrayAdapter 我如何正确使用AsyncTask以便我的解析器将返回一个ArrayList ,然后我可以将其放入ArrayAdapter

use this code 使用此代码

try {

        items = new ArrayList<String>();

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(new InputStreamReader(
                getUrlData(" url")));

        while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
            Log.i(TAG, "doc started");
            if (xpp.getEventType() == XmlPullParser.START_TAG) {
                if (xpp.getName().equals("entry")) {
                    items.add(xpp.getAttributeValue(0));
                }
            }
            xpp.next();

        }
    } catch (Throwable t) {
        Toast.makeText(this, "Request failed: " + t.toString(),
                Toast.LENGTH_LONG).show();
    }

get url data method 获取网址数据方法

public InputStream getUrlData(String url) throws URISyntaxException,
        ClientProtocolException, IOException {

    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet method = new HttpGet(new URI(url));
    HttpResponse res = client.execute(method);
    return res.getEntity().getContent();
}

Improper use of type parameters in subclass ( AsyncTask<Params, Progress, Result> ). 子类中类型参数的不正确使用( AsyncTask<Params, Progress, Result> )。 Re-write the AsyncTask sub-class. 重写AsyncTask子类。

  class loadFeedTask extends AsyncTask<String, Void, ArrayList<MangaItem>> {
    protected void onPostExecute(ArrayList<MangaItem> list) {
        lv1.setAdapter(new EfficientAdapter(MainActivity.this, list));
        ShowProgress.dismiss();
    }
    protected ArrayList<MangaItem> doInBackground(String... params) {
        ArrayList<MangaItem> list=null;
        String feedUrl = "http://www.mangapanda.com/alphabetical"; 
        FeedParser parser = new SaxFeedParser(feedUrl);
        list = parser.parse();
        MangaItemList=list;
        return list;
    }
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM