AsyncTask не работает как задумано - PullRequest
2 голосов
/ 24 октября 2011

Вот мой класс 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%! Когда я смотрю на сайт и обновляю страницу, он не показывает картинку. (В Wi-Fi изображение действительно загружается практически сразу, а когда веб-сайт обновляется сразу же, оно показывает новое изображение. Но в 3G этот процесс может занять несколько минут - вот почему я хочу, чтобы пользователь видел ход выполнения загружаемое фото).

  • Я не уверен, как использовать onProgressUpdate. Я пробовал несколько уроков, но безрезультатно. Если кто-то может заявить, что я могу сделать для этой ситуации, это будет полезно

Edit:

Runnable код:

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();
        }
    };

1 Ответ

4 голосов
/ 24 октября 2011

Вы запускаете новый поток внутри уже разделенного потока.

doInBackground() выполняется в другом потоке, отличном от UI-методов onPreExecute(), onPostExecute() и onProgressUpdate() класса AsyncTask,Все, что ваша асинхронная задача делает здесь - это запускает третий поток.Это занимает почти нет времени.После этого ваша задача будет завершена, в результате диалоговое окно будет закрыто немедленно.

Вы можете делать загрузку внутри doInBackground(), вам не нужно создавать новую тему там.Вот что класс AsyncTask уже сделал для вас.

Что касается прогресса: onProgressUpdate() вызывается каждый раз, когда вы выполняете publishProgress().Так что это правильно реализовано, вам просто нужно несколько раз вызвать publishProgress() во время процесса загрузки, чтобы соответствующим образом обновить индикатор выполнения (например, каждый отправленный процент).

...