1

わからない問題があります。Android で簡単な進行状況ダイアログを表示したい。そこでAsyncTask、コンストラクターでダイアログを作成して作成しました。ダイアログにメソッドを使用し、ダイアログonPreExceutionを破棄するメソッドを使用します。したがって、これまでのところ、これは私にとって完全に正しいように見えます。しかし、Nexus 7 でアプリを起動すると、ジョブが完了するまでダイアログが表示されません。つまり、ジョブの最後に 0.5 秒間表示されます...何が間違っているのでしょうか?initialiseonPostExecute

ご協力ありがとうございました ;)

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> {
    ProgressDialog dialog;

    public ParseHTMLCodeNew(Context context) {
        dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        //einrichten des Wartedialogs
        dialog.setTitle("Bitte warten!");
        dialog.setMessage("Die Kommentare werden vom Server geladen.");
        dialog.show();
    }

    @Override
    protected String doInBackground(String params) {
        InputStream is = null;
        String data = "";
        try
        {
            URL url = new URL( params[0] ); 
            is = url.openStream(); 
            data = new Scanner(is).useDelimiter("//html//").next(); 
        } 
        catch ( Exception e ) { 
            e.printStackTrace(); 
        } 
        return data;
    }

    @Override
    protected void onPostExecute(String result) {       
        //Dialog beenden RSS Feed ist fertig  geparst
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }        
    }
}

アップデート

これは私の新しい AsyncTask です:

public class ParseHTMLCodeNew extends AsyncTask<String, String, String> {
ProgressDialog dialog;
private final OnCompleteTaskListener onCompleteTaskListener;

public interface OnCompleteTaskListener {
        void onComplete(String data);
}

public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) {
    onCompleteTaskListener = taskListener;
    dialog = new ProgressDialog(context);
}


@Override
protected void onPreExecute() {

    //einrichten des Wartedialogs
    dialog.setTitle("Bitte warten!");
    dialog.setMessage("Die Kommentare werden vom Server geladen.");
    dialog.show();

}

@Override
protected String doInBackground(String... params) {
    InputStream is = null; 
    String data = "";
    try 
    { 
      URL url = new URL( params[0] ); 
      is = url.openStream(); 
      data = new Scanner(is).useDelimiter("//html//").next(); 
    } 
    catch ( Exception e ) { 
      e.printStackTrace(); 
    } 
    return data;
}

@Override
protected void onPostExecute(String result){

  onCompleteTaskListener.onComplete(result);

  //Dialog beenden RSS Feed ist fertig  geparst
  if (dialog != null && dialog.isShowing()) {
      dialog.dismiss();
  }




}
}

そして、私はそれをこのように呼んでいます:

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() {

        @Override
        public void onComplete(String data) {
            gData = data;

        }
    }).execute(url);

あなたの投稿にコメントしたように、data価値はありません。

4

3 に答える 3

0

オンライン データベースからデータを取得し、そのデータを lisview に入力するコードを作成しました。これが私のコードの一部です。

class LoadMyData extends AsyncTask<String, String, String> {
        //Before starting background thread Show Progress Dialog

        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getParent());
            pDialog.setMessage("Loading. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        protected String doInBackground(String... args) {

                    //Your code here 

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting the data
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    // In my case use my adapter to display the data in a listview 


                    adapter = new MyAdaper();
                    list.setAdapter(adapter);
                }
            });
        }
    }
于 2012-12-08T17:03:05.653 に答える
0

進行状況ダイアログは UI スレッドから表示する必要があります

 runOnUiThread(new Runnable() {
            public void run() {
dialog.setTitle("Bitte warten!");
dialog.setMessage("Die Kommentare werden vom Server geladen.");
dialog.show();
}});
于 2012-12-08T17:43:21.343 に答える
0

このコードを次のように呼び出す場合:

String data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get();

次に、ブロッキング UI があるため、ダイアログが実際には表示されません。メソッド get() は、必要に応じて計算が完了するのを待ってから、その結果を取得します。

そう呼ぶ:

new ParseHTMLCodeNew(CommentActivity.this).execute(url);

作業の結果は AsyncTask で直接処理されます。

データをメインスレッドに転送する必要がある場合は、タスクが完了したことを彼に伝える必要があります。ワットは単純なコードです。OnCompleteTaskListener インターフェイスを追加しただけです

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> {

    private final OnCompleteTaskListener onCompleteTaskListener;
    private ProgressDialog dialog;

    public interface OnCompleteTaskListener {
        void onComplete(String data);
    }

    public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) {
        onCompleteTaskListener = taskListener;
        dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {

        // einrichten des Wartedialogs
        dialog.setTitle("Bitte warten!");
        dialog.setMessage("Die Kommentare werden vom Server geladen.");
        dialog.show();

    }

    @Override
    protected String doInBackground(String... params) {
        StringBuilder sb = new StringBuilder();

        // your code here
        try {
            for (int i = 0; i < 100; i++) {
                Thread.sleep(100);
                sb.append(i);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        // Dialog beenden RSS Feed ist fertig geparst
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }

        onCompleteTaskListener.onComplete(result);
    }
}

そして呼び出しの例

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() {

            @Override
            public void onComplete(String data) {
                Toast.makeText(CommentActivity.this, data, Toast.LENGTH_LONG).show();

            }
        }).execute("your_url");

携帯電話を回転させると、このコードでエラーが発生する可能性があることに注意してください。アクティビティが破棄されたがタスクが実行された場合: - 進行状況ダイアログが閉じられ、再び開かれません - ダイアログまたはコンテキストへのローカル変数が正しくありません。

長時間操作を行った場合、サービスを通過できますか?

于 2012-12-08T21:17:44.367 に答える