-2

Google Places API を使用して、近くの興味深い場所のリストを返します。各場所とその属性は、result タグと /result タグで囲まれています。最初の /result タグに遭遇した後、parser.next() ステートメントがあるときはいつでもメインスレッド例外でネットワークを取得します。

      try {
        int type = parser.getEventType();
         Locations obj = null;

        while (type != XmlPullParser.END_DOCUMENT) {

            String name = parser.getName();
            switch (type) {
                case XmlPullParser.START_TAG: {
                    if (name.equalsIgnoreCase("result"))
                    {obj = new Locations();}

                    else if (name.equalsIgnoreCase("name"))
                        obj.name = parser.nextText();

                    else if (name.equalsIgnoreCase("vicinity"))
                        obj.address = parser.nextText();
                    else if (name.equalsIgnoreCase("lat"))
                        lat = parser.nextText();
                    else if (name.equalsIgnoreCase("lng")) {
                        lng = parser.nextText();
                    LatLng latLng = new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
                        obj.latlng = latLng;
                    }
                    break;
                }

                case XmlPullParser.END_TAG: {
                    if (name.equalsIgnoreCase("result")) {
                        entries.add(obj);
                    }
                    break;
                }
            }//End Switch Case
            type = parser.next();

            }//End While Block



        } //End try block

      catch (IOException ioex)
      {
        ioex.printStackTrace();
      }
      catch (XmlPullParserException ioex)
      {
        ioex.printStackTrace();
      }
      catch (Exception ioex)
      {
        ioex.printStackTrace();
      }

Locations クラスの各オブジェクトは場所を表します。別のスレッドを使用して httpurl 接続アクティビティを実行し、読み取りタイムアウトを 3 分に設定しました。(以下のクラスは、http ネットワーク接続を開くために使用されます)

    public class DownloadxmlTask  {

    public String status=null;
    public InputStream isi=null;
    private InputStream loadXmlfromnetwork(String url) {
    InputStream in = null;
    try {
        URL urlobj = new URL(url);
        HttpURLConnection conobj = (HttpURLConnection) urlobj.openConnection();
        conobj.setReadTimeout(3*60000);
        in = conobj.getInputStream();
        isi=in;
        status = in.toString();
        wait(3*60000);
        conobj.disconnect();
     } catch (Exception ex) {
        status =ex.getLocalizedMessage().toString();
      }
      return in;
      }
     protected InputStream doInBackground(String params) {

        final String url = params;

    Thread newthread=new Thread() {
        @Override
        public void run() {
            loadXmlfromnetwork(url);
        }
            };
        newthread.start();
      return isi;
      }
     } 
4

1 に答える 1

0

エラーは一目瞭然です。UI メインスレッドとは別のスレッド内でパーサー呼び出しを実行する必要があります。これを実現するにはさまざまな手法がありますが、最も簡単なのは AsyncTask を作成することです。

AsyncTask 実装の最も単純なバージョンを貼り付けました。doInBackground() メソッドは独自の別のスレッドで実行され、onPostExecute() は UI メイン スレッドで実行されます。

すべてのパーサー ロジックを doInBackground() メソッド内に配置します。

private final AsyncTask<Void, Void, Void> cacheInitializationTask = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            //Runs on UI thread
            super.onPostExecute(aVoid);
        }
    };

詳細については、このリンクにアクセスしてください AsyncTask

于 2015-08-05T14:06:40.113 に答える