在解析XML期间,Android应用程序问题

时间:2013-06-20 15:08:44

标签: android xml-parsing dbpedia

我正在尝试解析包含描述标记的XML,以便从中提取内容(摘要)。活动意外关闭/停止工作。 您可以访问URL中的链接并添加查询以查看我正在尝试解析的XML结果。

public class ResultActivity extends Activity{ //implements TextToSpeech.OnInitListener {
 InputStream is = null;
 private TextView textView;
 XmlPullParserFactory pullParserFactory;
 private static final String DEBUG_TAG = "HttpExample";
 String query,result;
 //private TextToSpeech tts;

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,        //Code for full screen activity
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_result);
    Intent i = getIntent();
    query = i.getStringExtra("query");
    textView = (TextView) findViewById(R.id.mytext);
    myClickHandler();
    //speakout();

}

public void myClickHandler() {
        query.replace(' ', '_');
        String stringUrl = "http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryClass=place&QueryString="+query;
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            new DownloadWebpageTask().execute(stringUrl);
        } else {
            textView.setText("No network connection available.");
        }
        }



/*NEW subCLASS*/
class DownloadWebpageTask extends AsyncTask<String, Void, String> {

    String ns=null;
    @Override
protected String doInBackground(String... urls) {

        // params comes from the execute() call: params[0] is the url.
        try {
            return downloadUrl(urls[0]);
        } catch (IOException e) {
            return "Unable to retrieve web page. URL may be invalid.";
        }
    }

private String downloadUrl(String myurl) throws IOException {
          try {
                URL url = new URL(myurl);
                HttpURLConnection.setFollowRedirects(true);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                // Starts the query
                conn.connect();
                int response = conn.getResponseCode();
                Log.d(DEBUG_TAG, "The response is: " + response);
                is = conn.getInputStream();

               pullParserFactory = XmlPullParserFactory.newInstance();
                XmlPullParser parser = pullParserFactory.newPullParser();
                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                parser.setInput(is, null);
               // result=convertStreamToString(is);
                result=parseXML(parser);
              }
               catch (XmlPullParserException e) {
                    e.printStackTrace();
               }    finally {
                if (is != null) {
                    is.close();
                } 
            }
            return result;
        }
    // onPostExecute displays the results of the AsyncTask.


     @Override
protected void onPostExecute(String result) {
        textView.setText(result);
     }
//FINAL TEXT VIEW WIDGET DISPLAY


private String parseXML(XmlPullParser parser) throws XmlPullParserException, IOException {
        String res = null;
        int eventType = parser.getEventType();

         while (eventType != XmlPullParser.END_DOCUMENT) {
             String name = parser.getName();
             if(eventType == XmlPullParser.START_DOCUMENT) {
              System.out.println("Start document");
              textView.setText("Reached");
          } else if(eventType == XmlPullParser.END_DOCUMENT) {
              System.out.println("End document");
          }
          else if(name.equals("description")) {
              res=readSummary(parser);
          } 
          eventType = parser.next();
         }
    return res;
    }

    //PARSE OUT THE DESCRIPTION TAG     

private String readSummary(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "description");
        String summary = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "description");
        return summary;
    }     

    //PARSE OUT THE DESCRIPTION CONTENT FROM THE TAG    

private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
                String result = "";
                if (parser.next() == XmlPullParser.TEXT) {
                    result = parser.getText();
                    parser.nextTag();
                }
                return result;

    }       

}


}

我的LOGCAT

06-19 19:47:08.344: E/Trace(662): error opening trace file: No such file or directory (2)
06-19 19:47:09.666: D/gralloc_goldfish(662): Emulator without GPU emulation detected.
06-19 19:49:32.676: D/HttpExample(662): The response is: 200
06-19 19:49:36.036: D/dalvikvm(662): GC_CONCURRENT freed 248K, 3% free 10985K/11271K, paused 79ms+40ms, total 289ms
06-19 19:53:21.125: D/gralloc_goldfish(716): Emulator without GPU emulation detected.
06-19 19:53:53.435: D/HttpExample(716): The response is: 200
06-19 19:53:53.465: I/System.out(716): Start document
06-19 19:53:53.475: W/dalvikvm(716): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
06-19 19:53:53.535: E/AndroidRuntime(716): FATAL EXCEPTION: AsyncTask #1
06-19 19:53:53.535: E/AndroidRuntime(716): java.lang.RuntimeException: An error occured while executing doInBackground()
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.lang.Thread.run(Thread.java:856)
06-19 19:53:53.535: E/AndroidRuntime(716): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4609)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:835)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.View.requestLayout(View.java:15129)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.View.requestLayout(View.java:15129)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.View.requestLayout(View.java:15129)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.View.requestLayout(View.java:15129)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.view.View.requestLayout(View.java:15129)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.widget.TextView.checkForRelayout(TextView.java:6309)
06-19 19:53:53.535: E/AndroidRuntime(716):  at     android.widget.TextView.setText(TextView.java:3547)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.widget.TextView.setText(TextView.java:3405)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.widget.TextView.setText(TextView.java:3380)
06-19 19:53:53.535: E/AndroidRuntime(716):  at com.example.verch.ResultActivity$DownloadWebpageTask.parseXML(ResultActivity.java:150)
06-19 19:53:53.535: E/AndroidRuntime(716):  at com.example.verch.ResultActivity$DownloadWebpageTask.downloadUrl(ResultActivity.java:122)
06-19 19:53:53.535: E/AndroidRuntime(716):  at com.example.verch.ResultActivity$DownloadWebpageTask.doInBackground(ResultActivity.java:96)
06-19 19:53:53.535: E/AndroidRuntime(716):  at com.example.verch.ResultActivity$DownloadWebpageTask.doInBackground(ResultActivity.java:1)
06-19 19:53:53.535: E/AndroidRuntime(716):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-19 19:53:53.535: E/AndroidRuntime(716):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-19 19:53:53.535: E/AndroidRuntime(716):  ... 5 more
06-19 19:53:57.464: I/Process(716): Sending signal. PID: 716 SIG: 9

2 个答案:

答案 0 :(得分:0)

试试这个:

parser.require(XmlPullParser.START_TAG, ns, "description");
String summary = parser.nextText();
parser.require(XmlPullParser.END_TAG, ns, "description");

答案 1 :(得分:0)

我不认为这是一个解析错误。 正如异常所说,除非是UI线程,否则无法处理线程内的视图。 在后台线程上运行的parseXML中,您尝试在视图上设置.Text。