0

「お待ちください」という進行状況ダイアログが必要です。コードがxmlファイルをダウンロードして解析しているのに、進行状況ダイアログが表示されないため、どういうわけかスタックします。私はAsyncTaskを使用しており、xmlファイルのダウンロードと解析はバックグラウンドスレッドで実行されます。進行状況ダイアログを削除するとコードは機能しますが、その場合、UIを動的に作成するボタンをクリックするには約4秒待つ必要があります。

private class ParseXML extends AsyncTask<Integer, Integer, Document>{

private Context context;
    private Activity activity;
    private ProgressDialog pd;
    public ParseXML(Activity activity) {
        this.activity = activity;
        context = activity;
        pd = new ProgressDialog(context);
    }




    public void onPreExecute(){
        super.onPreExecute();
    /*  ProgressDialog pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");*/

    }


    @Override
protected Document doInBackground(Integer... params) {

     DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
    Document dom1=null;
    try {

        //InputStream is=getResources().openRawResource(R.raw.options);
        URL requestURL = new URL("my url");
        URLConnection connection = requestURL.openConnection();
        is = connection.getInputStream();


        DocumentBuilder db = dbf.newDocumentBuilder();
        dom1=db.parse(is);
        Log.i(TAG,"parsing done");

    }

    catch(ParserConfigurationException pce){
        pce.printStackTrace();
    }
    catch(SAXException se){
        se.printStackTrace();
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }


    ParseDocument(dom1); 



    return null;
    }           

    @Override
    public void onPostExecute(Document d){
        if(pd!=null && pd.isShowing()){
               pd.dismiss();
               }
        super.onPostExecute(d);

    }
}
4

2 に答える 2

0

1. UIはUIスレッドで、Non-UIはNon-UIスレッドで作業するのが常に推奨されていましたが、Android版HoneyCombからはルールになりました。

2.を使用しているので、メソッドから専用 UI スレッドで表示を開始しAsyncTaskます。ProgressDialog onCreate()

3.次に、再び専用 UI スレッドにある from メソッドを閉じます ProgressDialogonPostExecute()

于 2012-08-08T11:07:15.237 に答える
0

あなたはここで間違いを犯しています

 public void onPreExecute(){
  super.onPreExecute();
 /*  ProgressDialog pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");*/
  }

ProgressDialog pdあなたはローカル変数を宣言しています

そしてコントロールが来るとき

@Override
    public void onPostExecute(Document d){
        if(pd!=null && pd.isShowing()){
               pd.dismiss();
               }
        super.onPostExecute(d);

    }

グローバル pd 変数を初期化していないため、ここでは pd は null です。これが、アラート ダイアログが閉じられない理由です。

これを機能させるには、いくつかの変更を加えるだけですonPreExecute

public void onPreExecute(){
      super.onPreExecute();
       pd=ProgressDialog.show(XML_PARSER.this,"","Please Wait");
      }
于 2012-08-08T11:07:35.737 に答える