doInBackground调用AsyncTask然后休眠阻止UI线程

时间:2011-11-16 12:12:59

标签: android android-asynctask ui-thread

我有一个活动,由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)

现在它工作正常。

谢谢大家,希望有一天能帮助别人!

3 个答案:

答案 0 :(得分:0)

您是否可以尝试在布局文件中添加ProgressBar控件,并在启动异步任务时将其Visible设置为true,并在进程结束时设置为off。以下是相同的代码。

<ProgressBar 
android:layout_width="wrap_content" 
android:id="@+id/progressBar1" 
android:layout_height="wrap_content"></ProgressBar>

答案 1 :(得分:0)

很难说,但是试试onClickListener:

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

这是一个非常疯狂的猜测,但它可能会起作用

答案 2 :(得分:0)

您无需创建其他任务,只需通过其他活动进行搜索。

您需要做的就是为搜索任务搜索cod ein 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

            }   
        }