3

私は最初の Android アプリケーションを開発しており、xml ファイルが doInBackground メソッドで処理されるまで進行状況ダイアログを表示したいと考えています。このアクティビティは、onclick イベントに応答して読み込まれます。予期せず、アクティビティが表示されるまでに数秒かかり、進行状況ダイアログが表示されるのはごくわずかな時間 (数ミリ秒) です。

これは私のコードです。AsyncTask を内部クラスとして使用しました。どこが間違っているのかわかりません。

public class WhatToSee extends ListActivity {
ListView whatToSee;
ArrayList<HashMap<String, String>> whatToSeeInfo = new ArrayList<HashMap<String, String>>();
WhatToSeeAdapter adapter;
String cityName;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.whattosee);
    cityName = getIntent().getStringExtra("name");
    whatToSee = (ListView) findViewById(android.R.id.list);
    adapter= new WhatToSeeAdapter(this, whatToSeeInfo);
    whatToSee.setAdapter(adapter);
    new WhatToSeeLoader().execute();
}




public class WhatToSeeLoader extends AsyncTask<Void, String, String> {
    ProgressDialog progress = new ProgressDialog(WhatToSee.this);
    String url = "http://wearedesigners.net/clients/clients12/tourism/fetchWhatToSeeList.php";
    final String TAG_MAIN = "item";
    final String TAG_ID = "itemId";
    final String TAG_NAME = "itemName";
    final String TAG_DETAIL = "itemDetailText";
    final String TAG_MAP = "itemMapData";
    final String TAG_ITEM_IMAGE = "itemImages";
    final String TAG_MAP_IMAGE = "mapImage";
    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(url); // getting XML
    Document doc = parser.getDomElement(xml); // getting DOM element
    NodeList nl = doc.getElementsByTagName(TAG_MAIN);

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        progress.setMessage("Loading What To See List");
        progress.setIndeterminate(true);
        progress.show();

    }

    @Override
    protected String doInBackground(Void... params) {
        // TODO Auto-generated method stub
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            map.put(TAG_ID, parser.getValue(e, TAG_ID));
            map.put(TAG_NAME, parser.getValue(e, TAG_NAME));
            map.put(TAG_DETAIL, parser.getValue(e, TAG_DETAIL));
            map.put(TAG_MAP, parser.getValue(e, TAG_MAP));
            map.put(TAG_MAP_IMAGE, parser.getValue(e, TAG_MAP_IMAGE));
            map.put(TAG_ITEM_IMAGE, parser.getValue(e, TAG_ITEM_IMAGE));

            // adding HashList to ArrayList
            whatToSeeInfo.add(map);
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        adapter.notifyDataSetChanged();
        progress.dismiss();

    }

}

}

誰かがこれで私を助けてくれますか? 前もって感謝します。

4

1 に答える 1

2

ほとんどの場合、呼び出しString xml = parser.getXmlFromUrl(url); // getting XMLによってコードが遅くなります。doInBackgroundメインスレッドで実行され、(その名前から) ネットワーク関連のスタッフを実行することを期待していますが、これは基本的に UI スレッド (Yoursメソッドなど)では実行されません。
したがって、修正するには、xml に関連する初期化スタッフを 内に移動してみてくださいdoInBackground()

于 2012-11-01T15:02:39.480 に答える