android - AsyncTask 未按预期工作

标签 android android-asynctask progress

这是我的 AsyncTask 类:

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

        @Override protected void onPreExecute() {
            dia = new ProgressDialog(pictures.this);
            dia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dia.setMessage("Please wait while content is loaded...");
            dia.setCancelable(false);
            dia.show();
        }

        @Override protected Void doInBackground(Void... voids) {


            Thread thread = new Thread(null, uploader, "MagentoBackground");
            thread.start();

            //publishProgress(100);  keep this commented or no?
            return null;
        }

        @Override public void onProgressUpdate(Integer... prog) {
            if (prog == null)
                return;
            dia.setProgress(prog[0]);
        }

        @Override  protected void onPostExecute(Void voids) {
            dia.setMessage("Done");
            dia.cancel();
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    }

我现在担心一个主要问题和一个小问题。以下依次是主要问题和次要问题:

  • 此应用程序的目的是拍摄照片并将其上传到网站。一旦用户点击“确定”按钮上传,AsyncTask 对话框就会显示,所以这很好。然而,它只显示对话框一瞬间,已经 100% 完成,然后强制关闭。然而,它肯定不是 100% 完成的!当我查看网站并刷新页面时,它不显示图片。 (在 WiFi 上,图片实际上会立即上传,并且当网站立即刷新时,它会显示新图片。但在 3G 上,这个过程可能需要几分钟 - 这就是为什么我希望用户看到进度照片正在上传)。

  • 我不确定如何使用onProgressUpdate。我尝试了几个教程,但没有效果。如果有人能说明我能针对这种情况做些什么,那将会很有帮助

编辑:

可运行代码:

private Runnable uploader = new Runnable() {
        @Override
        public void run() {

            /**JER 3**/
            if (teacherInfo != null)
                teacher = " - " + teacherInfo ;
            else teacher = "" ;

            if (schoolInfo != null )
                school = " - " + schoolInfo ;
            else school = "" ;


            /********/

            if(Descriptor.desString.equals("")) Descriptor.desString = "No description provided.";

            int sessionId = rapi.createSession(experimentInput.getText().toString(), 
                    name.getText().toString() + teacher + school + " - " + time, 
                    Descriptor.desString, "n/a", "Lowell, MA", "");


            JSONArray dataJSON = new JSONArray();
            JSONArray subData = new JSONArray();

                try {
                    subData.put(curTime); subData.put(Lat); subData.put(Long); subData.put(Descriptor.desString);
                    dataJSON.put(subData);
                }
                catch (JSONException e) {
                    e.printStackTrace();
                }


            Boolean result = rapi.updateSessionData(sessionId, experimentInput.getText().toString(), dataJSON);

            if (result) {
                rapi.uploadPictureToSession(picture, experimentInput.getText().toString(), 
                        sessionId, name.getText().toString() + teacher + school + " - " + time, 
                        name.getText().toString() + Descriptor.desString);
            }

            //if (m_ProgressDialog != null && m_ProgressDialog.isShowing()) m_ProgressDialog.dismiss();
        }
    };

最佳答案

您正在一个已经分离的线程中启动一个新线程。

doInBackground() 在与 UI 方法 onPreExecute()onPostExecute()onProgressUpdate 不同的线程中执行() AsyncTask 类。您的异步任务在这里所做的就是启动第三个线程。这几乎不需要时间。之后您的任务完成,导致对话框立即关闭。

您可以在 doInBackground() 中进行上传,无需在那里启动新线程。这就是 AsyncTask 类已经为您所做的事情。

关于进度:每次执行 publishProgress() 时都会调用 onProgressUpdate()。因此,这是正确实现的,您只需在上传过程中多次调用 publishProgress() 即可相应更新进度条(例如发送的每个百分比)。

关于android - AsyncTask 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7878937/

相关文章:

java - 更改进度条粗细和动画速度

android - 如果反复启动/停止,为什么 AsyncTask 不会启动?

c++ - 无法在 Windows API 中实现仪表

java - Logback:将进度记录到一行

android - 无法通过 Debug/Release APK 版本查看 map

android - 重命名包后,我的项目在 android 中构建时显示错误

android - NestedSCrollView 在 CoordinatorLayout 中没有完全滚动

android-asynctask - 在 AsyncTask 的 getApplication() 上找不到符号

java - 实现 AsyncTask 的正确方法是什么?静态或非静态嵌套类?

ios - 如何使用另一个类的urlSession中的变量