Android отображение отображается перед получением значений из бэкэнда - PullRequest
0 голосов
/ 21 апреля 2020

Я немного новичок в android и пытаюсь разработать собственное приложение, используя синтаксический анализ в качестве бэкэнда. Здесь я пытаюсь получить количество комментариев к сообщению от разбора. Когда я выполняю обратный вызов с использованием асинхронной задачи, данные в пользовательском интерфейсе обрабатываются даже до того, как данные возвращаются, показывая все мои комментарии как ноль, даже если их нет. Когда я отлаживаю, я получаю правильный размер, но он отображается еще до этого. Когда я попытался выполнить отладку с использованием журналов, как показано в приведенном ниже коде, я получил отладку.

2020-04-21 13:53:58.984 22308-22589/com.project I/gg: outside
2020-04-21 13:53:59.090 22308-22595/com.project I/gg: outside
2020-04-21 13:53:59.127 22308-22598/com.project I/gg: outside
2020-04-21 13:53:59.162 22308-22601/com.project I/gg: outside
2020-04-21 13:53:59.203 22308-22589/com.project I/gg: outside
2020-04-21 13:53:59.238 22308-22595/com.project I/gg: outside
2020-04-21 13:53:59.247 22308-22308/com.project I/gg: post
2020-04-21 13:53:59.470 22308-22308/com.project I/gg: post
2020-04-21 13:53:59.472 22308-22308/com.project I/gg: post
2020-04-21 13:53:59.523 22308-22308/com.project I/gg: inside
2020-04-21 13:53:59.843 22308-22308/com.project I/gg: inside
2020-04-21 13:54:00.156 22308-22308/com.project I/gg: inside
2020-04-21 13:54:00.176 22308-22308/com.project I/gg: inside
2020-04-21 13:54:00.325 22308-22308/com.project I/gg: inside

Как видите, процесс происходит не в правильном порядке.

Буду рад, если кто-то может указать на ошибку. Если для ответа на этот вопрос нужен какой-либо другой ресурс, не стесняйтесь спрашивать, я добавлю его. Спасибо.

 static public class CommentAsyncTask extends AsyncTask<Void, String, String> {
            String objectId;
            TextView commentsView;

        CommentAsyncTask(String objectId, TextView commentsView) {
            this.objectId = objectId;
            this.commentsView = commentsView;
        }
        @Override
        protected String doInBackground(Void... voids) {
            ParseQuery<ParseObject> objectParseQuery = ParseQuery.getQuery("Comments");
            objectParseQuery.whereEqualTo("quoteId", objectId);
            objectParseQuery.setLimit(20);
            objectParseQuery.orderByAscending("createdAt");
            final Bitmap[] tempBitmap = new Bitmap[1];
            final int[] size = new int[1];
            Log.i("gg", "outside");
            objectParseQuery.findInBackground(new FindCallback<ParseObject>() {
                @Override
                public void done(List<ParseObject> objects, ParseException e) {
                    if (e == null) {
                        size[0] = objects.size();
                        Log.i("gg", "inside");
                    }
                }
            });
            return String.valueOf(size[0]);
        }


        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if(s != null){
                commentsView.setText("View all " + s + " comments");
            }
            Log.i("gg","post");
        }
    }

1 Ответ

0 голосов
/ 21 апреля 2020

В методе doInBackground вы устанавливаете слушателя, а затем переходите к postExecute без ожидания результата, чтобы получить ноль. если для используемого вами метода есть какая-либо версия syn c, то вы должны использовать ее вместо версии обратного вызова внутри AsyncTask, или вы можете забыть о AsyncTask и вызывать findInBackground из потока пользовательского интерфейса следующим образом:

 // here you set call back without waiting for result
//so it could be used from UI thread instead of AsyncTask
objectParseQuery.findInBackground(new FindCallback<ParseObject>() { 
        @Override
        public void done(List<ParseObject> objects, ParseException e) {
            if (e == null) {
                Log.i("gg", "inside");
                commentsView.setText("View all " + objects.size() + " comments");// set text here
            }
        }
});
...