【问题标题】:Android - Closing Progress Bar Upon Thread CompletionAndroid - 线程完成后关闭进度条
【发布时间】:2014-02-20 16:59:34
【问题描述】:

我按照这里给我的说明(1.ASyncTask):

Download a file with Android, and showing the progress in a ProgressDialog

它在一定程度上起作用。文件下载(使用我自己的下载代码)并显示一个旋转的进度对话框。伟大的。唯一的问题是代码完成后对话框没有关闭。那可能是因为我无法让 onPreExecute 工作。我不太确定把它放在哪里。无论代码走到哪里,都会引发许多错误。让我发布我目前拥有的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    c = this;
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    double getWidth = size.x * 0.9;
    scWidth = (int)getWidth;


    cWhite = getResources().getColor(R.color.white);
    cBlack = getResources().getColor(R.color.black);
    cTrans = getResources().getColor(R.color.transparent);  
    cBlue = getResources().getColor(R.color.blue);  
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    version = sharedPreferences.getString("version", "0.1");
    Editor editor = sharedPreferences.edit();
    editor.putString("area", "Home");

    editor.commit();
    setContentView(R.layout.activity_main);

    setupDrawer();
    if(sharedPreferences.getString("new", "Yes").equals("Yes")){
        loadFiles();
    }

private void loadFiles(){
    if(isNetworkAvailable() == true){


    ProgressDialog mProgressDialog;

    // instantiate it within the onCreate method
    mProgressDialog = new ProgressDialog(this);
    mProgressDialog.setMessage("Downloading files...");
    mProgressDialog.setIndeterminate(true);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    mProgressDialog.setCancelable(true);

    // execute this when the downloader must be fired
    final DownloadTask downloadTask = new DownloadTask(this);
    downloadTask.execute();
    mProgressDialog.show();
    mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            downloadTask.cancel(true);
        }

    });

    }else{
        new AlertDialog.Builder(this)
        .setTitle("No internet detected")
        .setMessage("Must have internet access to download files.")
        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) { 
                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c);


                if(sharedPreferences.getString("new", "Yes").equals("Yes")){

                    ((Activity) c).finish();
                }
            }
         })


         .show();

    }
}

然后在我有一个新班级的底部:

private class DownloadTask extends AsyncTask<Integer, Void, Void> {

    private Context context;
    private PowerManager.WakeLock mWakeLock;

    public DownloadTask(Context context) {
        this.context = context;
    }

    @Override
    protected Void doInBackground(Integer... sUrl) {

            DataClass dc = new DataClass(c);
            //ArrayList<String> menuArray = dc.getMenuArray("Home");
            String[] menuArray = {"Home", "Announcements", "Speakers", "Events", "Exhibitors", "Agenda", "Hotels", "Documents"}; 
            File dir = getDir("myDir", Context.MODE_PRIVATE);

            for(int i=1; i <= 7; i++){
                String[] menuList = handleMenuInfo(menuArray[i]);
                for(int i2=1; i2 < menuList.length; i2++){
                File file = new File(dir, menuArray[i]  + "/" + menuList[i2] + ".txt");
                ArrayList<String> viewArray = dc.getInfoArray(menuArray[i],menuList[i2]);
                writeToFile(file, viewArray);
                }
            }
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c);
            Editor editor = sharedPreferences.edit();
            editor.putString("new", "No");
            editor.commit();

       return null;

    }
}


}

那么我可以将代码放在哪里来处理所有其他内容,例如进度和/或在对话框结束时关闭对话框?

【问题讨论】:

    标签: android multithreading android-asynctask progress-bar


    【解决方案1】:

    使用 OnPreExecute 在下载任务类中移动进度条的代码

    @Override
    protected void onPreExecute() {
    ....progressbar code
    }
    

    然后在 onPostExecute 上关闭它并关闭

      @Override
     protected void onPostExecute() {
        mProgressDialog.dismiss();
    

    }

    【讨论】:

    • 你是说这在“doInBackground”中?
    • 哦,在同一个类中,现在在 doInBackground 中。它工作正常,但没有看到 mProgressDialog。
    • 我修好了。我不需要 onPreExecute 或 onPostExecute,我只需要将 mProgressDialog 设为公共对象并将 mProgressDialog.dismiss() 放在 editor.commit() 下
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多