Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框

Posted

技术标签:

【中文标题】Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框【英文标题】:Android - Display Progress Dialog on button click ONLY if AsyncTask has not completed 【发布时间】:2017-09-02 19:06:54 【问题描述】:

我正在构建一个 OCR android 应用程序,该应用程序在后台执行许多图像处理任务,这需要一些时间才能完成。 它执行的步骤如下:

    捕获图像 向用户显示图像,提供重新捕获图像或继续操作的选项 显示处理后的图像,提供重新捕获图像或继续的选项。 提取文本

这些任务非常耗时,我想通过在前一个任务完成后立即开始下一个任务来减少一些时间,同时仅当用户单击继续按钮并且任务已完成时才显示进度对话框“请稍候”未完成。

我想知道这是否可能,如果可以,我该如何实现?

以下是我的 OCR 任务代码:

private class OCRTask extends AsyncTask<Void, Void, String> 

    ProgressDialog mProgressDialog;

    public OCRTask(PreviewActivity activity) 
        mProgressDialog = new ProgressDialog(activity);
    

    @Override
    protected String doInBackground(Void... params) 

        String path = previewFilePath;

        String ocrText;

        OCR ocr = new OCR();
        ocrText = ocr.OCRImage(path, PreviewActivity.this);

        // Write the result to a txt file and store it in the same dir as the temp img
        // find the last occurence of '/'
        int p=previewFilePath.lastIndexOf("/");
        // e is the string value after the last occurence of '/'
        String e=previewFilePath.substring(p+1);
        // split the string at the value of e to remove the it from the string and get the dir path
        String[] a = previewFilePath.split(e);
        String dirPath = a[0];

        String fileString = dirPath + "ocrtext.txt";
        File file = new File(fileString);

        try 
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(ocrText);

            bw.close();
            System.out.println("done!!");

         catch (IOException i) 
            i.printStackTrace();
        

        new WordCorrect(fileString);

        return ocrText;
    
    @Override
    protected void onPreExecute() 
        // Set the progress dialog attributes
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgressDialog.setMessage("Extracting text...");
        mProgressDialog.show();
    

    @Override
    protected void onPostExecute(String result) 
        // dismiss the progress dialog
        mProgressDialog.dismiss();


        Intent i;
        i = new Intent(PreviewActivity.this, ReceiptEditActivity.class);
        // Pass the file path and text result to the receipt edit activity
        i.putExtra(FILE_PATH, previewFilePath);
        Log.e("OCR TEXT: ", result);
        i.putExtra(OCR_TEXT, result);
        // Start receipt edit activity
        PreviewActivity.this.startActivityForResult(i, 111);
        finish();
    

    @Override
    protected void onProgressUpdate(Void... values) 

非常感谢任何帮助或指导!

【问题讨论】:

【参考方案1】:

只需在 Activity 或 Fragment 中取一个布尔变量,例如

public static boolean isTaskRunning = false;

并在 AsyncTask 的 onPreExecute() 内部,将其值更改为 true。

YourActivity.isTaskRunning = true;

我正在考虑您在活动课程中使用了这个变量。并在 onPostExecute(String result) 内部,将其值恢复为 false

YourActivity.isTaskRunning = false;

现在,单击按钮时,检查此变量值,如果其 true 则显示您的 进度对话框,否则不显示。

【讨论】:

以上是关于Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框的主要内容,如果未能解决你的问题,请参考以下文章

Android如何在数据进入后设置listview适配器

Android面试Android异步任务AsyncTask

Android自助餐之AsyncTask

android:如果一个 AsyncTask 已经在运行,则阻止另一个 AsyncTask 执行

android asynctask怎么用

Android AsyncTask分析