Как использовать поток для разбора xml-файла на заставке?

#android #multithreading

#Android #многопоточность

Вопрос:

Я создал экран-заставку и использовал запускаемый поток для разбора xml-файла с сервера, но когда я запускаю эту программу, она просто застревает на экране-заставке, и я использовал wifimanage, чтобы определить, подключено ли устройство к Интернету или нет, если это не так, то пропустите синтаксический анализ и перейдите к основному действию.

вот некоторые из моих кодов, не будет ли кто-нибудь так любезен ознакомиться с ними?

 private static WifiManager mWifiManager;
    private static UpdateInfo info;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);

        mWifiManager = (WifiManager)
                this.getSystemService(Context.WIFI_SERVICE);
    }
    public UpdateInfo getUpdateInfo(InputStream is) throws Exception{  
        if (mWifiManager.getWifiState()==WifiManager.WIFI_STATE_ENABLED){
        XmlPullParser  parser = Xml.newPullParser();    
        parser.setInput(is, "utf-8");//设置解析的数据源   
        int type = parser.getEventType();  
        info = new UpdateInfo();//实体  
        while(type != XmlPullParser.END_DOCUMENT ){  
            switch (type) {  
            case XmlPullParser.START_TAG:  
                if("version".equals(parser.getName())){  
                    info.setVersion(parser.nextText()); //获取版本号  
                }else if ("url".equals(parser.getName())){  
                    info.setUrl(parser.nextText()); //获取要升级的APK文件  
                }else if ("description".equals(parser.getName())){  
                    info.setDescription(parser.nextText()); //获取该文件的信息  
                }  
                break;  
            }  
            type = parser.next();  
        }  
        }else{
             Intent intent = new Intent ();
             intent.setClass(loading.this, monkeynote.class);
             startActivity(intent);
           }

        return info;  

    } 
  

Ответ №1:

Ваш код запускает действие только в том случае, если загрузка завершается неудачей. Вам нужно переместить создание намерения за пределы инструкции else. Измените свой метод на этот:

 public UpdateInfo getUpdateInfo(InputStream is) throws Exception{  
  if (mWifiManager.getWifiState()==WifiManager.WIFI_STATE_ENABLED){
    XmlPullParser  parser = Xml.newPullParser();    
    parser.setInput(is, "utf-8");//设置解析的数据源   
    int type = parser.getEventType();  
    info = new UpdateInfo();//实体  
    while(type != XmlPullParser.END_DOCUMENT ){  
        switch (type) {  
        case XmlPullParser.START_TAG:  
            if("version".equals(parser.getName())){  
                info.setVersion(parser.nextText()); //获取版本号  
            }else if ("url".equals(parser.getName())){  
                info.setUrl(parser.nextText()); //获取要升级的APK文件  
            }else if ("description".equals(parser.getName())){  
                info.setDescription(parser.nextText()); //获取该文件的信息  
            }  
            break;  
        }  
        type = parser.next();  
    }  
  }
  Intent intent = new Intent ();
  intent.setClass(loading.this, monkeynote.class);
  startActivity(intent);


  return info;  

} 
  

Комментарии:

1. что ж, я изменил код на этот, но приложение по-прежнему зависало на заставке, на этом действие с заставкой не заканчивается, программа в конечном итоге перейдет к следующему действию, вот полная версия моего кода

2. попробуйте использовать синтаксические анализаторы SAX, и если выдается исключение, то пользователь не подключен к Интернету. Пример здесь: mkyong.com/java/how-to-read-xml-file-in-java-sax-parser