所以我有一个我已经研究了一段时间的程序。但是,我坚持使用XmlPullParser
的方法,该方法被调用getAllXml()
。它在 a 的doInBackGround()
方法内部AsyncTask
。AsyncTask
是一个名为 Activity 的子类 FormActivity
。当我运行代码时。
这是代码应该做的事情。在用户"CloverField"
从以前的活动中选择之后。调用的 xml 文件cloverfield_in.xml
由setContentView()
. 然后用户在同一个 xml 文件上按下一个按钮。单击此按钮执行被AsyncTask
调用的MadLIbAsyncTask
. 这AsyncTask
里面只有两个方法,thedoInBackground()
和onPostExecute()
. (我不知道我是否需要onPreExecute()
......在其中我会有一个进度条......但如果没有这种方法,我认为程序不应该像它那样崩溃)。
在该doInBackground()
方法中,我调用了名为getAllXml()
. 此方法用于XmlPullParser
搜索当前 xml( cloverfield_in.xml
) 并从单个 .xml 文件中捕获文本TextView
。的代码getAllXml()
如下。
public void getAllXml() throws XmlPullParserException, IOException{
Activity activity = this;
Resources res = activity.getResources();
XmlResourceParser xpp = res.getXml(R.layout.cloverfield_in);
int eventtype = xpp.getEventType();
while (eventtype != XmlPullParser.END_DOCUMENT){
if (eventtype == XmlPullParser.START_DOCUMENT){
}
else if (eventtype == XmlPullParser.START_TAG){
if (xpp.getName() == "TextView"){
while (eventtype != XmlPullParser.END_TAG){
if (eventtype == XmlPullParser.TEXT){
stringViews[0] = xpp.getText();
}else {}
eventtype = xpp.next();
}
}else {}
}
else if (eventtype == XmlPullParser.END_TAG){
}
else if (eventtype == XmlPullParser.TEXT){
}
eventtype = xpp.next();
}
}
在调试过程中,我的程序经常返回 aNullPointerException
或 a RunTimeException
。我相信在这段代码中是问题所在。我在AsyncTask
不存在该getAllXml()
方法的情况下进行了测试,一切正常。最终,程序应该从cloverfield_in.xml
文件中获取文本并将其显示在一个名为cloverfield_out.xml
.
对于所有内容的完整回顾,这里是FormActivity.class
.
package com.muirconsult.mymadlibs;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
public class FormActivity extends Activity{
String [] textFields;
String Choice;
int thisLayout;
View thatLayout ;
String[] stringViews;
ViewGroup anskey;
Activity activity = this;
String test;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent objIntent = getIntent();
Choice = objIntent.getStringExtra("selection");
if (Choice.equals("Cloverfield")) {
setContentView(R.layout.cloverfield_in);
thisLayout = (R.layout.cloverfield_in);
thatLayout = (View)findViewById(R.layout.cloverfield_out);
}
if (Choice.equals("Fargo")) {
setContentView(R.layout.fargo_in);
}
if(Choice.equals("Ying Yang In This Thang (Ying Yang Twins)")){
setContentView(R.layout.ying_yang_twins_in_this_thang_in);
}
}
public void getAllXml() throws XmlPullParserException, IOException{
Activity activity = this;
Resources res = activity.getResources();
XmlResourceParser xpp = res.getXml(R.layout.cloverfield_in);
int eventtype = xpp.getEventType();
while (eventtype != XmlPullParser.END_DOCUMENT){
if (eventtype == XmlPullParser.START_DOCUMENT){
}
else if (eventtype == XmlPullParser.START_TAG){
if (xpp.getName() == "TextView"){
while (eventtype != XmlPullParser.END_TAG){
if (eventtype == XmlPullParser.TEXT){
stringViews[0] = xpp.getText();
}else {}
eventtype = xpp.next();
}
}else {}
}
else if (eventtype == XmlPullParser.END_TAG){
}
else if (eventtype == XmlPullParser.TEXT){
}
eventtype = xpp.next();
}
}
class MadLibAsyncTask extends AsyncTask<Void, Void, Void>{
String testString;
int thisLayout;
protected Void doInBackground(Void... params) {
try{
getAllXml();
}catch (XmlPullParserException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return null;
}
protected void onPostExecute (Void result){
String str = "let's go to the park";
String newstr;
setContentView(R.layout.cloverfield_out);
TextView outview = (TextView)findViewById(R.id.outview);
str = (String) outview.getText();
newstr = str.replaceFirst("film",stringViews[0]);
outview.setText(newstr);
}
}
public void onClick(View view) {
MadLibAsyncTask mad = new MadLibAsyncTask();
mad.execute();
}
}
此外,最重要的是...... logcat 看起来像这样:
08-10 23:04:50.064: W/dalvikvm(1415): threadid=1: thread exiting with uncaught exception >>> (group=0x40a71930)
08-10 23:04:50.145: E/AndroidRuntime(1415): FATAL EXCEPTION: main
08-10 23:04:50.145: E/AndroidRuntime(1415): java.lang.NullPointerException
08-10 23:04:50.145: E/AndroidRuntime(1415): at java.util.regex.Matcher.appendEvaluated>(Matcher.java:130)
08-10 23:04:50.145: E/AndroidRuntime(1415): at java.util.regex.Matcher.appendReplacement(Matcher.java:110)
08-10 23:04:50.145: E/AndroidRuntime(1415): at java.util.regex.Matcher.replaceFirst(Matcher.java:299)
08-10 23:04:50.145: E/AndroidRuntime(1415): at java.lang.String.replaceFirst(String.java:1793)
08-10 23:04:50.145: E/AndroidRuntime(1415): at com.muirconsult.mymadlibs.FormActivity$MadLibAsyncTask.onPostExecute(FormActivity.java:116)
08-10 23:04:50.145: E/AndroidRuntime(1415): at com.muirconsult.mymadlibs.FormActivity$MadLibAsyncTask.onPostExecute(FormActivity.java:1)
08-10 23:04:50.145: E/AndroidRuntime(1415): at android.os.AsyncTask.finish(AsyncTask.java:631)
08-10 23:04:50.145: E/AndroidRuntime(1415): at android.os.AsyncTask.access$600>\ (AsyncTask.java:177)
08-10 23:04:50.145: E/AndroidRuntime(1415): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-10 23:04:50.145: E/AndroidRuntime(1415): at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 23:04:50.145: E/AndroidRuntime(1415): at android.os.Looper.loop(Looper.java:137)
08-10 23:04:50.145: E/AndroidRuntime(1415): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-10 23:04:50.145: E/AndroidRuntime(1415): at java.lang.reflect.Method.invokeNative(Native Method)
08-10 23:04:50.145: E/AndroidRuntime(1415): at java.lang.reflect.Method.invoke(Method.java:511)
08-10 23:04:50.145: E/AndroidRuntime(1415): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-10 23:04:50.145: E/AndroidRuntime(1415): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-10 23:04:50.145: E/AndroidRuntime(1415): at dalvik.system.NativeStart.main(Native Method)