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

Android doInBackground调用AsyncTask然后休眠阻止UI线程,android,android-asynctask,ui-thread,Android,Android Asynctask,Ui Thread,我有一个活动,由一个异步任务组成,目标是在用户单击按钮时启动一个请求。我一直在寻找答案,但我没有发现同样的问题,或者对我来说不一样。代码正在执行我想要的操作,但是ProgressDialog看起来被阻塞了,因为微调器有时(几乎一直)没有转动 当我点击按钮时: AsyncTask启动->showDialog()调用onPreExecute->startSearch(SearchManager启动一个新的AsyncTask,其中在doInBackground中有大量的网络调用)->doInBackg

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

当我点击按钮时:

AsyncTask启动->showDialog()调用onPreExecute->startSearch(SearchManager启动一个新的AsyncTask,其中在doInBackground中有大量的网络调用)->doInBackground在活动中等待SearchManager加载->显示

按钮代码:

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

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

            }   
        }
搜索活动中异步任务的代码:

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

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

            }   
        }
与原因问题一起使用,我改为

removeDialog(DIALOG_LOADING_ID)
现在它工作得很好


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

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

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

这很难说,但请为onClickListner尝试以下内容:

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

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

您不需要创建另一个任务,只需通过另一个活动来执行搜索

您所需要做的就是将搜索任务的doInbackGround()放在搜索区域中。e、 g

@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

            }   
        }

searchManager.startSearch();是在打扮!这应该在doinBackground中。为什么需要在
onPreExecute
中启动另一个异步任务?为什么不直接运行
global.getDataManager().doSearch()SearchTask
doInBackground()
中的code>?@sher如果不是,则应初始化AsyncTask并从ui调用thread@Vladimir阻止进程的唯一解释是此功能被阻止。您在真实设备中测试过吗?好,我没有创建第二个异步任务,而是将网络内容放在searchManager.startSearch()中,并将调用表单放在后台,但微调器仍然无法共享您的完整doe,您如何显示微调器?您正在使用旋转对话框吗?ProgressDialog ProgressIndicator=ProgressDialog.show(mContext,null,“加载”,true);是的,你是对的,这就是问题所在!Disclose deletes animationIt的操作与以前完全相同;)