4

ユーザーがボタンをクリックしたときにリクエストを起動することを目的としたAsyncTaskで構成されるアクティビティがあります。私は答えを探していましたが、同じ問題が見つからなかったか、同じではありませんでした。コードは私が望むことを実行していますが、スピナーが時々(ほとんど常に)回転していないため、ProgressDialogはブロックされているように見えます。

ボタンをクリックすると:

AsyncTaskが起動されます->showDialog()がonPreExecute-> startSearchで呼び出されます(SearchManagerはdoInBackgroundで新しいAsyncTaskを起動し、ネットワークで大量の呼び出しがあります)->ActivityのdoInBackgroundはSearchManagerがロードされるのを待ちます->表示します。

ボタンのコード:

button_search.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                new SearchTask().execute();

            }
        });

検索アクティビティのAsyncTaskのコード:

private class SearchTask extends AsyncTask<Void,Void,Void>{

        @Override
        protected void onPreExecute(){
            showDialog(DIALOG_LOADING_ID);

            searchManager.startSearch();
        }

        @Override
        protected Void doInBackground(Void... params) {


            while(searchManager.isLoading()){
                try {Thread.sleep(150);} catch(Exception e){};
            }


            return null;
        }

        @Override
        protected void onPostExecute(Void ret){
            try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){};

            if ( searchManager.errorOccurred() ){
                //Error
            } else {
                //No Error

            }   
        }

SearchManagerAsyncTaskのコード:startSearchによって直接起動されます

protected class SearchAsync extends AsyncTask <Void,Void,Void>{

        @Override
        protected Void doInBackground(ComSearchAds... datas) {
            global.getDataManager().doSearch();
                        //... When finished
                        setIs_loading(false);
                }
}

私はどうやら何か間違ったことをしているようですが、これを回避する方法と方法を見つけることができません。ご協力いただきありがとうございます !

解決 :

最後に、ProgressDialogが回転しないのは、ProgressDialogの同じインスタンスを使用していたためであるようです。

showDialog(DIALOG_LOADING_ID); 
//doInBackground
dismissDialog(DIALOG_LOADING_ID);

原因の問題で使用され、私はに変更しました

removeDialog(DIALOG_LOADING_ID)

そして今、それはうまく機能しています。

すべてに感謝し、それがいつか誰かを助けることができることを願っています!

4

3 に答える 3

0

レイアウトファイルにProgressBarコントロールを追加し、非同期タスクの開始時にVisibleをtrueに設定し、プロセスの終了時にgoingに設定してください。以下は同じもののコードです。

<ProgressBar 
android:layout_width="wrap_content" 
android:id="@+id/progressBar1" 
android:layout_height="wrap_content"></ProgressBar>
于 2011-11-16T12:18:24.890 に答える
0

言うのは難しいですが、onClickListnerでこれを試してください:

button_search.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        new SearchTask().execute();
        setIs_loading(true);
        searchManager.startSearch(); 
    }
});

かなりワイルドな推測ですが、うまくいくかもしれません

于 2011-11-16T12:27:23.843 に答える
0

別のアクティビティを介して検索を行う代わりに、別のタスクを作成する必要はありません。

あなたがする必要があるのはあなたに検索タスクの検索コードdoInbackGround()を置くことです。例えば

@Override
protected Void doInBackground(Void... params) {

    global.getDataManager().doSearch();
    return null;
}

また、クラスレベルの変数を使用して検索結果を取得し、true/falseを格納します

@Override
        protected void onPostExecute(Void ret){

            // Set you result here
            setIs_loading(my_searh_result);

            try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){};

            if ( searchManager.errorOccurred() ){
                //Error
            } else {
                //No Error

            }   
        }
于 2011-11-16T12:27:59.100 に答える