Java 解析从Wikia提取的XML文件中的信息,并将其显示在Android ListView中

Java 解析从Wikia提取的XML文件中的信息,并将其显示在Android ListView中,java,android,listview,android-activity,mediawiki,Java,Android,Listview,Android Activity,Mediawiki,您好,我已经在这个项目上工作了一段时间,目前我非常困惑,我还是Android新手,一直在开发我的第一个应用程序,它从我用MediaWiki API创建的XML文件中提取信息。每次我尝试在我的应用程序上选择“玩家”选项卡时,它都会强制关闭,我不知道为什么。以下是我的players活动和Wikiparser活动的代码: package com.lvlup.kikurself.scotttest; import java.net.MalformedURLException; import java.

您好,我已经在这个项目上工作了一段时间,目前我非常困惑,我还是Android新手,一直在开发我的第一个应用程序,它从我用MediaWiki API创建的XML文件中提取信息。每次我尝试在我的应用程序上选择“玩家”选项卡时,它都会强制关闭,我不知道为什么。以下是我的players活动和Wikiparser活动的代码:

package com.lvlup.kikurself.scotttest;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;

import java.io.IOException;
import org.xml.sax.SAXException;

//import com.lvlup.kikurself.scotttest.WikiParser.Cm;

public class scottPlayers extends ListActivity {
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

WikiParser p = new WikiParser();
ArrayList<String> titles = new ArrayList<String>();

try {
    p.parseInto(new URL("http://scottlandminecraft.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Players&cmlimit=500&format=xml"), titles);

} catch (MalformedURLException e) {
} catch (IOException e) {
} catch (SAXException e) {}

    //String[] values = new String[50]; 
    //values = res;




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

    setListAdapter(adapter);

    final ListView playersList = getListView();


    playersList.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long thisID)
    {
         Object o = (playersList.getItemAtPosition(position));
         String playerName_temp = (o.toString());

         Intent newIntent = new Intent(v.getContext(), playerDisp.class);
         newIntent.putExtra("tempN", playerName_temp);
         startActivity(newIntent);

    }
    });



    //get your data back again with: String fName = getIntent().getExtras().getInt("fname");




}}
package com.lvlup.kikurself.scottest;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.ArrayList;
导入android.app.ListActivity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.text.Html;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.AdapterView.OnItemClickListener;
导入java.io.IOException;
导入org.xml.sax.SAXException;
//导入com.lvlup.kikurself.scottest.WikiParser.Cm;
公共类scottPlayers扩展了ListActivity{
创建公共空间(捆绑冰柱){
超级冰柱;
WikiParser p=新的WikiParser();
ArrayList titles=新的ArrayList();
试一试{
p、 解析为(新URL(“http://scottlandminecraft.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Players&cmlimit=500&format=xml(名称),;
}捕获(格式错误){
}捕获(IOE异常){
}捕获(SAXE){}
//字符串[]值=新字符串[50];
//数值=res;
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,titles);
setListAdapter(适配器);
最终ListView播放器列表=getListView();
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长thisID)
{
对象o=(playerList.getItemAtPosition(位置));
字符串playerName_temp=(o.toString());
Intent newIntent=newIntent(v.getContext(),playerDisp.class);
newIntent.putExtra(“tempN”,playerName_temp);
星触觉(新意图);
}
});
//使用以下命令重新获取数据:String fName=getIntent().getExtras().getInt(“fName”);
}}
接下来是WikiParser函数的代码:

package com.lvlup.kikurself.scotttest;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import android.sax.*;
import android.text.TextUtils;
import android.util.Xml;
import android.util.Xml.Encoding;

public class WikiParser {
private static class CmListener implements StartElementListener {
    final List<String> mTitles;
    CmListener(List<String> titles) {
        mTitles = titles;
    }
    @Override
    public void start(Attributes attributes) {
        String title = attributes.getValue("", "title");
        if (!TextUtils.isEmpty(title)) {
            mTitles.add(title);
        }
    }
}
public void parseInto(URL url, List<String> titles) throws IOException, SAXException {
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    try {
        parseInto(new BufferedInputStream(con.getInputStream()), titles);
    } finally {
        con.disconnect();
    }
}
public void parseInto(InputStream docStream, List<String> titles) throws IOException, SAXException {
    RootElement api = new RootElement("api");
    Element query = api.requireChild("query");
    Element categoryMembers = query.requireChild("categorymembers");
    Element cm = categoryMembers.requireChild("cm");
    cm.setStartElementListener(new CmListener(titles));
    Xml.parse(docStream, Encoding.UTF_8, api.getContentHandler());
}
}
package com.lvlup.kikurself.scottest;
导入java.io.BufferedInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.List;
导入org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入android.sax.*;
导入android.text.TextUtils;
导入android.util.Xml;
导入android.util.Xml.Encoding;
公共类WikiParser{
私有静态类CmListener实现StartElementListener{
最后清单;
CmListener(列表标题){
mTitles=标题;
}
@凌驾
公共void开始(属性){
字符串title=attributes.getValue(“,“title”);
如果(!TextUtils.isEmpty(title)){
增加(标题);
}
}
}
public void parseInto(URL、列表标题)引发IOException、SAXException{
HttpURLConnection con=(HttpURLConnection)url.openConnection();
试一试{
parseInto(新的BufferedInputStream(con.getInputStream()),标题);
}最后{
con.disconnect();
}
}
public void parseInto(InputStream docStream,列表标题)抛出IOException、SAXException{
RootElement api=新的RootElement(“api”);
元素查询=api.requireChild(“查询”);
Element categoryMembers=query.requireChild(“categoryMembers”);
元素cm=类别成员。要求的类别(“cm”);
cm.setStartElementListener(新的CmListener(标题));
parse(docStream,Encoding.UTF_8,api.getContentHandler());
}
}
就是这样。我在这里学习我的错误,任何人都可以告诉我关于我的代码以及我可以做些什么来改进。如果有人知道哪里出了问题,请提前感谢

编辑:也包括LogCat,谢谢

    08-06 04:33:58.837: D/dalvikvm(539): GC_FOR_ALLOC freed 62K, 3% free 9883K/10179K, paused 64ms
08-06 04:33:58.917: I/dalvikvm-heap(539): Grow heap (frag case) to 13.641MB for 4096016-byte allocation
08-06 04:33:59.037: D/dalvikvm(539): GC_CONCURRENT freed <1K, 3% free 13882K/14215K, paused 12ms+17ms
08-06 04:33:59.748: D/gralloc_goldfish(539): Emulator without GPU emulation detected.
08-06 04:34:05.977: D/AndroidRuntime(539): Shutting down VM
08-06 04:34:05.987: W/dalvikvm(539): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
08-06 04:34:06.067: E/AndroidRuntime(539): FATAL EXCEPTION: main
08-06 04:34:06.067: E/AndroidRuntime(539): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lvlup.kikurself.scotttest/com.lvlup.kikurself.scotttest.scottPlayers}: android.os.NetworkOnMainThreadException
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.os.Looper.loop(Looper.java:137)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.ActivityThread.main(ActivityThread.java:4340)
08-06 04:34:06.067: E/AndroidRuntime(539):  at java.lang.reflect.Method.invokeNative(Native Method)
08-06 04:34:06.067: E/AndroidRuntime(539):  at java.lang.reflect.Method.invoke(Method.java:511)
08-06 04:34:06.067: E/AndroidRuntime(539):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-06 04:34:06.067: E/AndroidRuntime(539):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-06 04:34:06.067: E/AndroidRuntime(539):  at dalvik.system.NativeStart.main(Native Method)
08-06 04:34:06.067: E/AndroidRuntime(539): Caused by: android.os.NetworkOnMainThreadException
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
08-06 04:34:06.067: E/AndroidRuntime(539):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
08-06 04:34:06.067: E/AndroidRuntime(539):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
08-06 04:34:06.067: E/AndroidRuntime(539):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
08-06 04:34:06.067: E/AndroidRuntime(539):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
08-06 04:34:06.067: E/AndroidRuntime(539):  at com.lvlup.kikurself.scotttest.WikiParser.parseInto(WikiParser.java:35)
08-06 04:34:06.067: E/AndroidRuntime(539):  at com.lvlup.kikurself.scotttest.scottPlayers.onCreate(scottPlayers.java:29)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.Activity.performCreate(Activity.java:4465)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-06 04:34:06.067: E/AndroidRuntime(539):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
08-06 04:34:06.067: E/AndroidRuntime(539):  ... 11 more
08-06 04:33:58.837:D/dalvikvm(539):释放62K,3%释放9883K/10179K,暂停64ms
08-06 04:33:58.917:I/dalvikvm堆(539):为4096016字节分配将堆(frag案例)增长到13.641MB
08-06 04:33:59.037:D/dalvikvm(539):GC_并发释放的NetworkOnMainThreadException
当应用程序试图在其主线程上执行网络操作时引发的异常

这仅适用于目标为蜂巢SDK或更高版本的应用程序。针对早期SDK版本的应用程序可以在其主事件循环线程上进行联网,但这是非常不鼓励的。见文件

也看到

查看有关Stackoverflow的现有答案-

  • 有关更多详细信息,您可以获取

    NetworkOnMainThreadException 当应用程序试图在其主线程上执行网络操作时引发的异常

    这仅适用于目标为蜂巢SDK或更高版本的应用程序。针对早期SDK版本的应用程序可以在其主事件循环线程上进行联网,但这是非常不鼓励的。见文件

    也看到

    查看有关Stackoverflow的现有答案-

  • 有关更多详细信息,请访问

  • 始终建议将UI工作保持在UI线程上,非UI工作保持在非UI线程上,但随着Android蜂窝版本的到来,这已成为一项法律。

  • android中的应用程序以专用UI线程开始,因此当您创建另一个线程来处理网络、fileIO等长流程工作时,您将放弃专用UI线程。

  • 要同步UI线程和非UI线程,请将线程与处理程序或AsyncTas一起使用