Android 从后台线程更新用户界面

Android 从后台线程更新用户界面,android,android-asynctask,Android,Android Asynctask,我需要在五月异步任务中从onPostExecute方法更新UI。我尝试的是解析xml并从中提取文本。。我需要从onPostExecute为包含文本的每个xml节点动态创建textView,并将其添加到我的布局中 当我尝试执行此操作时,会出现Get-NetworkOnMainThread异常 我试图解决这个问题,但没有正常工作 请检查我的密码 protected void onPostExecute(final InputStream stream) { // dismiss the di

我需要在五月异步任务中从onPostExecute方法更新UI。我尝试的是解析xml并从中提取文本。。我需要从onPostExecute为包含文本的每个xml节点动态创建textView,并将其添加到我的布局中

当我尝试执行此操作时,会出现Get-NetworkOnMainThread异常

我试图解决这个问题,但没有正常工作

请检查我的密码

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;
        }
    }
  };

仍然会出现相同的错误。

您需要数据信息和setter的对象模型,可以使用以下方法:

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;
    }
 }
}

您未能发布整个任务,这迫使每个人都必须猜测

我猜您在doInBackground中进行了HTTP连接,然后将结果InputStream传递给onPostExecute。这将不起作用,因为InputStream绑定到网络套接字


将InputStream和XML解析移到doInBackground中。

当它抛出NetworkOnMainThreadException时,意味着在单独的线程中完成工作。因此,创建新线程并使用它完成工作。当您尝试执行一些可能需要很长时间的任务(例如从web获取一些数据)时,会引发此异常。您好,谢谢您的回复。是的,就是这样完成的。我认为这就是问题所在,但不知道如何实施。我可以在我的doInBackground中解析xml,但不知道每次节点解析完成后如何更新我的ui。。也就是说,当我们得到第一个内容及其类型和属性时,我需要根据它更新ui。。这一部分让我感到困惑。@VivekPPillai:不知道每次节点解析完成后如何更新我的ui-将doInBackground生成的临时结果存储在您自己设计的对象中。从doInBackground返回该对象,然后将该对象作为参数提供给onPostExecute。根据parse results对象中的数据更新onPostExecute中的UI。嗨,我已将xml解析部分移动到doInBackground方法。。当我们到达并获得一个文本节点及其属性时,每个节点都在解析,我实际需要的是,我需要在iu中创建一个包含文本节点内容的动态textview。。当图像节点出现时,我需要将imageview添加到ui中,以此类推。xml的格式不是静态的,每次都会有所不同,图像和文本节点的顺序有时会有所不同。我需要一个解决方案。。请帮帮我。我们如何用object来解决这个问题,你能给我一些代码吗。。我不熟悉模型教室。。你能给我一些密码吗。。我是说getter和setter课程。。我可以在我的doInBackground中解析xml,但不知道每次节点解析完成后如何更新我的ui。。也就是说,当我们得到第一个内容及其类型和属性时,我需要根据它更新ui。。那部分让我很困惑。。