【问题标题】:using AsyncTask class for parallel operationand displaying a progress bar使用 AsyncTask 类进行并行操作并显示进度条
【发布时间】:2012-05-31 04:02:41
【问题描述】:

我正在使用异步任务类显示一个进度条,同时并行操作,我想从另一个类的函数中检索一个字符串数组,该函数需要一些时间来返回字符串数组。

问题是,当我将函数调用放在做 AsyncTask 类的背景函数时,它在做背景时给出错误,并给出消息,因为在做背景时不能更改 UI ..

因此,我将函数调用放在 Asynctask 类的 post Execute 方法中。它不会给出错误,但在进度条达到 100% 后,屏幕会变黑并需要一些时间才能开始新的活动。

如何显示进度条并同时进行函数调用。??请帮助,m 遇险

这里是代码

package com.integrated.mpr;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Progess extends Activity implements OnClickListener{



    static String[] display = new String[Choose.n];
    Button bprogress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.progress);  
        bprogress = (Button) findViewById(R.id.bProgress);
        bprogress.setOnClickListener(this); 
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        switch(v.getId()){
        case R.id.bProgress:        
            String x ="abc";    
            new loadSomeStuff().execute(x);     
            break;
        }
    }

    public class loadSomeStuff extends AsyncTask<String , Integer , String>{

        ProgressDialog dialog;
        protected void onPreExecute(){
            dialog = new ProgressDialog(Progess.this);
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dialog.setMax(100);
            dialog.show();
        }
        @Override
        protected String doInBackground(String... arg0) {
            // TODO Auto-generated method stub

            for(int i = 0 ;i<40;i++){
                publishProgress(5);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            dialog.dismiss();
            String y ="abc";
            return y;
        }

        protected void onProgressUpdate(Integer...progress){

            dialog.incrementProgressBy(progress[0]);
        }

        protected void onPostExecute(String result){
            display = new Logic().finaldata();
            Intent openList = new Intent("com.integrated.mpr.SENSITIVELIST");
            startActivity(openList);    
        }
    }
}

【问题讨论】:

    标签: android android-asynctask android-progressbar


    【解决方案1】:

    您不能在 doInBackground() 中关闭对话框 - 即使关闭对话框也需要 UI 任务。将 dialog.dismiss() 移动到 AsyncTask 的 onPostExecute()。

    【讨论】:

    • 我应该将 dialog.dismiss() 放在 UI 任务中吗??
    • onPostExecute 正在 UI 任务上运行。
    • 简单地说,我必须进行一个返回数组的函数调用。这个电话需要一些时间。我必须在那段时间显示一个进度条。我该怎么做?
    • 只需按照我在回答中写的操作即可。将 dismiss 从 doInBackground() 移至 onPostExecute()。
    • 并将长时间运行的调用移回 doInBaxkground。这是 finalData() 的行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2012-10-27
    • 2016-06-11
    • 2015-03-29
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多