使用AsyncTask时更改对话框的消息?

Mxy*_*xyk 1 android message progressdialog android-asynctask

我查看了一些关于类似问题的其他问题,并且我发现我需要使用该onProgressUpdate方法来更改消息ProgressDialog.

例如,我有这样的代码在AsyncTasks 中运行doInBackGround(这只是一个非常小的样本):

        byte[] data = getBytesFromFile(image);

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        pictures.dia.setProgress(30);
        pictures.dia.setMessage("Data beginning upload sequence...");

        URL connectURL = new URL(this.base_url);
        HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "multipart/form-data, boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
        pictures.dia.setProgress(40);
        pictures.dia.setMessage("Output Stream prepared...");
Run Code Online (Sandbox Code Playgroud)

当我最初这样运行时,我得到一个漏洞窗口错误,说我不能改变dia之外的消息AsyncTask.

所以我的问题是,我如何使用onProgressUpdate设置进度dia何时dia达到一定数量的信息?(也就是说,当dia进度= 30时,让它说"数据开始上传序列...")
onProgressUpdate显然必须始终检查dia进度(就像听众,我想)[如果它还没有这样做,如何我可以这样做吗?]

Bri*_*ham 5

你需要实现的onProgressUpdate方法AsyncTask.创建一个包含进度百分比的新类,并将消息仅作为onProgressUpdate方法的唯一参数.

在onProgressUpdate中,调用dia.setProgressdia.setMessage.

在doInBackground方法中,publishProgress使用包含新百分比和消息的新类的实例进行调用.这将导致AsyncTask调用onProgressUpdate主线程.

例如:

private static class TaskProgress {
    final int percentage;
    final String message;

    TaskProgress(int percentage, String message) {
        this.percentage = percentage;
        this.message = message;
    }
}
Run Code Online (Sandbox Code Playgroud)

在AsyncTask中(用实现的正确类型替换?):

public ProgressAsyncTask extends AsyncTask<?, TaskProgress, ?> {

    public void onProgressUpdate(TaskProgress progress) {
         pictures.dia.setProgress(progress.percentage);
         pictures.dia.setMessage(progress.message);
    }

    public ? doInBackground(?... params) {
        // ... your code       
        publishProgress(new TaskProgress(30, "A new update"));
        // ... your code 
    }

}
Run Code Online (Sandbox Code Playgroud)