4

我有一个活动,由 AsyncTask 组成,旨在在用户单击按钮时启动请求。我一直在寻找答案,但我没有发现同样的问题,或者对我来说不一样。代码正在做我想做的事,但是 ProgressDialog 看起来被阻塞了,因为微调器有时(几乎一直)没有转动。

当我点击按钮时:

AsyncTask 已启动 -> showDialog() 被调用 onPreExecute -> startSearch (SearchManager 启动一个新的 AsyncTask,在 doInBackground 中有大量网络调用)-> doInBackground 在 Activity 等待 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,并在进程结束时设置为消失。下面是相同的代码。

<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;
}

还使用类级别变量来获取搜索结果以存储真/假

@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 回答