0

非同期タスクの onPostExecute メソッドから UI を更新する必要があります。私がしようとしているのは、xmlを解析してそこからテキストを取得することです.テキストを含むxmlノードごとにonPostExecute()からtextViewを動的に作成し、レイアウトに追加する必要があります..

これを実行しようとすると、NetworkOnMainThreadException が発生しました。

この問題を解決するためにハンドラを試しましたが、正しく動作しませんでした。

私のコードを確認してください。

protected void onPostExecute(final InputStream stream) {
    // dismiss the dialog after getting all albums
    pDialog.dismiss();

      try {

          XmlPullParser xpp = Xml.newPullParser();
          xpp.setInput(stream, null);
            xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            xpp.next();
            int eventType = xpp.getEventType();
            System.out.println("eventType : " + eventType);

              String tagname = null;
              String type = null;
              String link = null;
              String content = null;

            while (eventType != XmlPullParser.END_DOCUMENT)
            {

                 if(eventType == XmlPullParser.START_DOCUMENT){
                    // str += "\nXML Parsing Starting...\n";
                     eventType = xpp.next();
                     continue;
                 }
                 else if(eventType == XmlPullParser.START_TAG)
                 {
                    // str +=  "\nroot tag: "+xpp.getName();
                     tagname = xpp.getName();

                     if(xpp.getName().equals("text")){
                         if(xpp.getAttributeCount()>0){
                             type = xpp.getAttributeValue(null, "type");
                            // str +=  "\nroot attr: "+type;
                         }

                     }
                     else if((xpp.getName().equals("image")) || (xpp.getName().equals("audio")) || (xpp.getName().equals("video")) ){
                         if(xpp.getAttributeCount()>0){
                             link = xpp.getAttributeValue(null, "src");
                            // str +=  "\nroot attr: "+link;
                         }
                     }
                 }

                 else if(eventType == XmlPullParser.TEXT)
                 {
                     content = xpp.getText();
                    // str += "\nvalue : "+xpp.getText();
                 }
                 else if(eventType == XmlPullParser.END_TAG)
                 {
                    // str += "\nending tag: "+xpp.getName();


                     eventType = xpp.next();
                     continue;
                 }
                 System.out.println("content : " + content);
                 System.out.println("tagname : " + tagname);

                 if(content != null ){
                 if((tagname.equals("text") || tagname.equals("preview")) ){

                     // UPDATE_TEXT =1;
                     // TextView text = new TextView(ContentView.this);
                     text = new TextView(getBaseContext());
                     text.setText(content);

                     if(type != null){
                         if(type.equals("heading1"))
                             text.setTextAppearance(ContentView.this, R.style.heading1);
                         else if(type.equals("heading2"))
                             text.setTextAppearance(ContentView.this, R.style.heading2);
                         else if(type.equals("heading3"))
                             text.setTextAppearance(ContentView.this, R.style.heading3);
                         else if(type.equals("heading4"))
                             text.setTextAppearance(ContentView.this, R.style.heading4);
                         type = null;
                     }
                     if (text != null && layout != null){
                         Log.e(getPackageName(), text.toString());

                         runOnUiThread(new Runnable() {
                             public void run() {
                                 Message message = handler.obtainMessage();
                                 message.what = 1;
                                 handler.sendMessage(message);
                                 // handler.sendEmptyMessage(1);
                                 // layout.addView(text);
                             }
                         });
                     }

                     content = null;
                 }
                 else if((tagname.equals("image"))){

                     text = new TextView(ContentView.this);
                     text.setText(content);

                     if(link != null){

                         link = null;
                     }
                     runOnUiThread(new Runnable() {
                         public void run() {
                             handler.sendEmptyMessage(1);
                    // layout.addView(text);
                         }
                     });
                     content = null;
                 }
                 }

                 eventType = xpp.next();
            }
            // str += "\n\nXML parsing Ending......";

      } catch (XmlPullParserException e) {
            e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      }
 }

アクティビティ クラスのハンドラ クラスを確認してください。

protected Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 1:
            layout.addView(text);

            break;
        case 2:
            layout.addView(text);
            break;
        }
    }
  };

それでも同じエラーが発生します。

4

2 に答える 2

0

全体を投稿できなかったためAsyncTask、全員が推測する必要がありました。

私の推測では、 で HTTP 接続を行い、結果を にdoInBackground()渡しました。これはネットワーク ソケットに関連付けられているため、機能しません。InputStreamonPostExecute()InputStream

InputStreamおよび XML 解析を に移動しますdoInBackground()

于 2013-06-16T12:03:17.813 に答える
0

データ情報とセッターにはオブジェクトモデルが必要で、これを使用できます:

private ProgressDialog progressBar;

class MyTask extends AsyncTask<String, Void, String> {

 @Override
 protected void onPreExecute() {
    super.onPreExecute();

    progressBar = new ProgressDialog(getApplicationContext());
    progressBar.setMessage("please, waiting ...");
    progressBar.setCancelable(false);
    progressBar.show();

 }

 @Override
 protected String doInBackground(String... params) {

    try {

        // parsing xml and get data 
        // get info and set them in my model ...

    } catch (Exception e) {
        e.printStackTrace();
    }

    return params[0];
 }

 @Override
 protected void onPostExecute(String result) {
    super.onPostExecute(result);

    if (null != progressBar && progressBar.isShowing()) {
        progressBar.dismiss();
    }

    // do work in UI and set getter informations and set layout ...
   switch(select) {
   case 1:
        layout.addView(text);

        break;
    case 2:
        layout.addView(text);
        break;
    }
 }
}
于 2013-06-16T11:58:44.777 に答える