android如何使用asynctasks进度对话框

标签 android

Asynctask 有 4 个覆盖方法 onPreExecute(), doInBackground(), onProgressUpdate(), onPostExecute() 除了 onProgressUpdate 一切都在工作。 我应该怎么做才能使 onProgressUpdate() 起作用。 谁能简单解释一下onProgressUpdate()有什么用,里面应该写什么?

最佳答案

onProgressUpdate() 用于通过该方法操作异步操作的进度。注意数据类型为 Integer 的参数。这对应于类定义中的第二个参数。可以通过调用 publishProgress()doInBackground() 方法的主体内触发此回调。

示例

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class AsyncTaskExample extends Activity {

    protected TextView _percentField;

    protected Button _cancelButton;

    protected InitTask _initTask;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _percentField = (TextView) findViewById(R.id.percent_field);
        _cancelButton = (Button) findViewById(R.id.cancel_button);
        _cancelButton.setOnClickListener(new CancelButtonListener());
        _initTask = new InitTask();
        _initTask.execute(this);
    }

    protected class CancelButtonListener implements View.OnClickListener {

        public void onClick(View v) {
            _initTask.cancel(true);
        }
    }

    /**
     * sub-class of AsyncTask
     */
    protected class InitTask extends AsyncTask<Context, Integer, String> {

        // -- run intensive processes here
        // -- notice that the datatype of the first param in the class definition matches the param passed to this
        // method
        // -- and that the datatype of the last param in the class definition matches the return type of this method
        @Override
        protected String doInBackground(Context... params) {
            // -- on every iteration
            // -- runs a while loop that causes the thread to sleep for 50 milliseconds
            // -- publishes the progress - calls the onProgressUpdate handler defined below
            // -- and increments the counter variable i by one
            int i = 0;
            while (i <= 50) {
                try {
                    Thread.sleep(50);
                    publishProgress(i);
                    i++;
                }
                catch (Exception e) {
                    Log.i("makemachine", e.getMessage());
                }
            }
            return "COMPLETE!";
        }

        // -- gets called just before thread begins
        @Override
        protected void onPreExecute() {
            Log.i("makemachine", "onPreExecute()");
            super.onPreExecute();
        }

        // -- called from the publish progress
        // -- notice that the datatype of the second param gets passed to this method
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.i("makemachine", "onProgressUpdate(): " + String.valueOf(values[0]));
            _percentField.setText((values[0] * 2) + "%");
            _percentField.setTextSize(values[0]);
        }

        // -- called if the cancel button is pressed
        @Override
        protected void onCancelled() {
            super.onCancelled();
            Log.i("makemachine", "onCancelled()");
            _percentField.setText("Cancelled!");
            _percentField.setTextColor(0xFFFF0000);
        }

        // -- called as soon as doInBackground method completes
        // -- notice that the third param gets passed to this method
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Log.i("makemachine", "onPostExecute(): " + result);
            _percentField.setText(result);
            _percentField.setTextColor(0xFF69adea);
            _cancelButton.setVisibility(View.INVISIBLE);
        }
    }
}

关于android如何使用asynctasks进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6450275/

相关文章:

android - 使用不同方法在 gradle 构建期间合并资源

android - 单击通知栏时复制应用程序

android - Canvas 以黑色显示位图的透明部分 - Android

android - 在 Android 应用内计费

java - TCPSocket 服务在设备 sleep 模式下停止

android - 构建在 flutter 运行中卡在 "Starting a Gradle Daemon (subsequent builds will be faster)"

android - 如何将 ListView 扩展为 View

android - setExposureCompensation 在三星 Galaxy s3 中不起作用

java - 为什么我在 android 上使用 opencv 时会出现蓝色效果?

android - 将 APK 文件从构建位置复制到 gradle 4.4 中的其他位置