asyncTask onProgressUpdate在第二次调用时不起作用

时间:2017-07-18 19:37:25

标签: android android-asynctask dialog

我使用asyncTask显示下载进度,我的下载将由名为" file-downloader"的库完成。在我的主要活动中。 它的github页面是" https://github.com/wlfcolin/file-downloader"

当我点击指定的按钮时,我的自定义对话框显示,当我按下此自定义对话框中的下载按钮时,下载任务和progressBar启动 一切都很好,progressBar工作正常。

但当我关闭此对话框时,另一次我调用此对话框时,progressBar不起作用! 我使用fileDownloader库监听器在数据库中保存下载状态,然后我调用从数据库读取的自定义对话框 并检测downloadProgress当前正在运行,但我们看到自定义对话框的progressBar没有变化,有什么问题?

活动代码

outputXtableTest <- function( df, size){

  sizeNew = paste0("\\fontsize{", size,"pt}{", size+1, "pt}\\selectfont") 

  print.xtable(
             df, hline.after=c(-1,0, 1:nrow(table)),
             tabular.environment = 'longtable', 
             floating = FALSE, size = sizeNew
            )
}

下载Dialog Class

    public class MainActivity extends AppCompatActivity {


    /*
    /
    / some variables
    /
    */

    public static int downloadedFile2SizePercent = 0 ; // downloaded file percent 
    public static int downloadingFileStatus = 0;  // downloading status 
    Button myBtn ;
    DownloadDialog dd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    myBtn = (Button)findViewById(R.id.button22);
    myBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dd = new DownloadDialog(mContext,1);
            dd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            dd.show();
        }
    });

    /*
    / downloadingFileStatus value manages here by file downloader listeners correctly and saves as static variable and also in database
    / downloadedFile2SizePercent value manages here by file downloader listeners correctly and saves as static variable
    /
    */

    }


}

2 个答案:

答案 0 :(得分:0)

进度条就像任何其他UI元素一样,只能从主UI线程进行管理或更新。

应该在AsyncTask中运行的部分是耗时的任务,然后此任务可以将进度状态保存在volatile变量中,然后UI线程可以定期更新读取volatile变量的进度条,例如使用计时器。

答案 1 :(得分:0)

您可以在此处阅读AsyncTask所有内容:https://developer.android.com/reference/android/os/AsyncTask.html

但这是我的快速示例/教程:

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

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // prepare your UI for the background task beginning
    }

    @Override
    protected Void doInBackground(Void... params) {
        // do some long-running task...

        // you can do partial updates like:
        publishProgress(25);
        /* more hard work */
        publishProgress(50);
        /* even more hard work */
        publishProgress(75);

        // and when you're done...
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        // update your UI with the current progress (values[0])
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // update your UI now that it's done
    }
}

理解AsyncTask的关键概念是,除了 doInBackground()之外的每个方法都在UI线程(主线程)上执行。这意味着您可以从这些调用中自由更新UI。

但是,

doInBackground()在不同的线程上执行。这意味着您可以在这里进行昂贵的工作而不会降低应用程序的用户界面速度。

当然,你在后台线程上所做的所有艰苦工作都需要以某种方式进入UI线程(以便你可以使用它)。这就是publishProgress()的{​​{1}}和return声明的含义。当您致电doInBackground()时,系统会为您调用publishProgress(someValue)。当您onProgressUpdate(someValue)时,系统会为您调用return someValue