Android Xml解析空异常
我正在尝试构建一个简单的xml解析应用程序。但不幸的是,运行代码时似乎出现了错误。谁能帮我一下吗?谢谢 MainActivity.javaAndroid Xml解析空异常,android,xml,Android,Xml,我正在尝试构建一个简单的xml解析应用程序。但不幸的是,运行代码时似乎出现了错误。谁能帮我一下吗?谢谢 MainActivity.java public class MainActivity extends Activity { Button button; ListView listView; List<WorldPopulation> employees = null; ProgressDialog mProgressDialog; st
public class MainActivity extends Activity {
Button button;
ListView listView;
List<WorldPopulation> employees = null;
ProgressDialog mProgressDialog;
static final String RANK = "rank";
static final String COUNTRY = "country";
static final String POPULATION = "population";
ListView listview;
ArrayAdapter<WorldPopulation> adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
new DownloadXML().execute();
}
private class DownloadXML extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
employees = new ArrayList<WorldPopulation>();
XMLParser parser = new XMLParser();
String xml = parser
.getXmlFromUrl("My Secret URL");
Document doc = parser.getDomElement(xml);
try {
NodeList nl = doc.getElementsByTagName("ranking");
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
WorldPopulation employee = new WorldPopulation();
employee.setRank(parser.getValue(e, RANK));
employee.setCountry(parser.getValue(e, COUNTRY));
employee.setPopulation(parser.getValue(e, POPULATION));
employees.add(employee);
}
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void args) {
listview = (ListView) findViewById(R.id.listview);
adapter = new ArrayAdapter<WorldPopulation>(MainActivity.this,
R.layout.list_item, employees);
listView.setAdapter(adapter);
mProgressDialog.dismiss();
}
}
}
Logcat:
06-18 14:26:16.377: E/AndroidRuntime(22886): FATAL EXCEPTION: main
06-18 14:26:16.377: E/AndroidRuntime(22886): java.lang.NullPointerException
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.example.exampleparse.MainActivity$DownloadXML.onPostExecute(MainActivity.java:89)
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.example.exampleparse.MainActivity$DownloadXML.onPostExecute(MainActivity.java:1)
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.AsyncTask.finish(AsyncTask.java:602)
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.AsyncTask.access$600(AsyncTask.java:156)
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.Looper.loop(Looper.java:137)
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.app.ActivityThread.main(ActivityThread.java:4507)
06-18 14:26:16.377: E/AndroidRuntime(22886): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 14:26:16.377: E/AndroidRuntime(22886): at java.lang.reflect.Method.invoke(Method.java:511)
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
06-18 14:26:16.377: E/AndroidRuntime(22886): at dalvik.system.NativeStart.main(Native Method)
编辑
问题是您必须从上下文中调用findViewById,否则它将找不到视图 尝试更改onPostExecute()中的行,如下所示:
listview = (ListView) MainActivity.this.findViewById(R.id.listview);
new DownloadXML(MainActivity.this).execute();
我建议为需要上下文的AsyncTask实现一个构造函数,并将其保存到私有字段中
public DownloadXML(Context context) {
this.context = context;
}
然后你就可以简单地
listview = (ListView) context.findViewById(R.id.listview);
在“活动”中,按如下方式创建异步任务:
listview = (ListView) MainActivity.this.findViewById(R.id.listview);
new DownloadXML(MainActivity.this).execute();
这是一种方法。您需要实现一个构造函数。以下是解决方案:
public class MainActivity extends Activity {
Button button;
ListView listView;
List<WorldPopulation> employees = null;
ProgressDialog mProgressDialog;
static final String RANK = "rank";
static final String COUNTRY = "country";
static final String POPULATION = "population";
ListView listview;
ArrayAdapter<WorldPopulation> adapter;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
new DownloadXML(MainActivity.this).execute();
}
private class DownloadXML extends AsyncTask<Void, Void, Void> {
private Context context;
public void DownloadXML(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
employees = new ArrayList<WorldPopulation>();
XMLParser parser = new XMLParser();
String xml = parser
.getXmlFromUrl("MY Secret URL");
Document doc = parser.getDomElement(xml);
try {
NodeList nl = doc.getElementsByTagName("ranking");
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
WorldPopulation employee = new WorldPopulation();
employee.setRank(parser.getValue(e, RANK));
employee.setCountry(parser.getValue(e, COUNTRY));
employee.setPopulation(parser.getValue(e, POPULATION));
employees.add(employee);
}
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void args) {
listview = (ListView) ((Activity) context).findViewById(R.id.listview);
adapter = new ArrayAdapter<WorldPopulation>(MainActivity.this,
R.layout.list_item, employees);
listView.setAdapter(adapter);
mProgressDialog.dismiss();
}
}
}
公共类MainActivity扩展活动{
按钮;
列表视图列表视图;
列出员工=空;
进程对话框;
静态最终字符串RANK=“RANK”;
静态最终字符串COUNTRY=“COUNTRY”;
静态最终字符串POPULATION=“POPULATION”;
列表视图列表视图;
阵列适配器;
私人语境;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
新的下载XML(MainActivity.this).execute();
}
私有类下载XML扩展异步任务{
私人语境;
public void DownloadXML(上下文){
this.context=上下文;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
mProgressDialog=新建ProgressDialog(MainActivity.this);
设置消息(“加载…”);
mProgressDialog.setUndeterminate(false);
mProgressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
employees=newarraylist();
XMLParser=新的XMLParser();
字符串xml=语法分析器
.getXmlFromUrl(“我的秘密URL”);
Document doc=parser.getdoElement(xml);
试一试{
NodeList nl=doc.getElementsByTagName(“排名”);
对于(int i=0;i
尝试在oncreate方法开始时将listview初始化。我认为,这不是错误。这将停止您的应用程序对不起,我收到了相同的错误。
public class MainActivity extends Activity {
Button button;
ListView listView;
List<WorldPopulation> employees = null;
ProgressDialog mProgressDialog;
static final String RANK = "rank";
static final String COUNTRY = "country";
static final String POPULATION = "population";
ListView listview;
ArrayAdapter<WorldPopulation> adapter;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
new DownloadXML(MainActivity.this).execute();
}
private class DownloadXML extends AsyncTask<Void, Void, Void> {
private Context context;
public void DownloadXML(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
employees = new ArrayList<WorldPopulation>();
XMLParser parser = new XMLParser();
String xml = parser
.getXmlFromUrl("MY Secret URL");
Document doc = parser.getDomElement(xml);
try {
NodeList nl = doc.getElementsByTagName("ranking");
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
WorldPopulation employee = new WorldPopulation();
employee.setRank(parser.getValue(e, RANK));
employee.setCountry(parser.getValue(e, COUNTRY));
employee.setPopulation(parser.getValue(e, POPULATION));
employees.add(employee);
}
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void args) {
listview = (ListView) ((Activity) context).findViewById(R.id.listview);
adapter = new ArrayAdapter<WorldPopulation>(MainActivity.this,
R.layout.list_item, employees);
listView.setAdapter(adapter);
mProgressDialog.dismiss();
}
}
}