Java 在Android上用Sax解析Xml

Java 在Android上用Sax解析Xml,java,android,xml,parsing,Java,Android,Xml,Parsing,我试图从url页面解析XML。为此,我使用了中介绍的SAX实现以及适配器和我从中得到的其他更改。我还尝试实现一个AsyncTask来进行解析并显示一个ProgressDialog,但我认为这就是我的应用程序开始崩溃的地方 我真的不知道如何将AsyncTask实现到我的代码中,我相信我糟糕的实现导致我的应用程序被迫关闭 主要活动: public class MainActivity extends Activity { /** Called when the activity is first c

我试图从url页面解析
XML
。为此,我使用了中介绍的SAX实现以及
适配器
和我从中得到的其他更改。我还尝试实现一个
AsyncTask
来进行解析并显示一个
ProgressDialog
,但我认为这就是我的应用程序开始崩溃的地方

我真的不知道如何将
AsyncTask
实现到我的代码中,我相信我糟糕的实现导致我的应用程序被迫关闭

主要活动:

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;
    }


}
}
公共类MainActivity扩展活动{
/**在首次创建活动时调用*/
ListView lv1;
进步对话显示进步;
public static ArrayList MangaItemList=new ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv1=(ListView)findViewById(R.id.listView1);
ShowProgress=ProgressDialog.show(MainActivity.this,“,
“正在加载。请稍候…”,正确);
//新建loadingTask()。执行(“http://www.mangapanda.com/alphabetical");
新建loadFeedTask().execute();
lv1.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
Intent Intent=新的Intent(Intent.ACTION\u视图).setData(Uri
.parse(MangaItemList.get(position.getMangaLink());
星触觉(意向);
}
});
}
类loadFeedTask扩展了AsyncTask{
私有字符串feedUrl;
受保护的void onPostExecute(字符串s){
lv1.setAdapter(新的EfficientAdapter(MainActivity.this,MangaItemList));
//新的MangaParserTask().execute();
ShowProgress.disclose();
}
受保护的ArrayList doInBackground(字符串…参数){
ArrayList ParsedMangaItemList=新建ArrayList();
feedUrl=”http://www.mangapanda.com/alphabetical"; 
FeedParser=新的SaxFeedParser(feedUrl);
ParsedMangaItemList=parser.parse();
对于(MangaItem mitem:ParsedMangaItemList){
MangaItemList.add(mitem);
}
返回MangaItemList;
}
}
}
如何正确使用
AsyncTask
,以便解析器返回
ArrayList
,然后将其放入
ArrayAdapter
使用此代码

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();
    }

子类(
AsyncTask
)中类型参数使用不当。重新编写
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;
    }
  }
类loadFeedTask扩展了AsyncTask{ 受保护的void onPostExecute(ArrayList列表){ lv1.setAdapter(新的EfficientAdapter(MainActivity.this,list)); ShowProgress.disclose(); } 受保护的ArrayList doInBackground(字符串…参数){ ArrayList list=null; 字符串feedUrl=”http://www.mangapanda.com/alphabetical"; FeedParser=新的SaxFeedParser(feedUrl); list=parser.parse(); MangaItemList=列表; 退货清单; } }
您的方式是正确的。怎么了?@AVD我的应用程序在运行时会强制关闭。Logcat没有给出任何错误,但在
DalvikVM
下面有两个
AsyncTask
Thread
,其中一个旁边写着“挂起的运行时异常”。这差不多是我调试这个的时间了,我发现了一些不相关的代码,。请看answer-post。此示例使用
XmlPullParser
而不是
SaxParser
。我将不得不为此重新编写处理程序,但我会尝试让它。让您知道它是如何进行的。对于noob问题,很抱歉,它说“Mainactivity.loadfeedtask类型的方法getUrlData()未定义”
  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;
    }
  }