onPostExecute() 似乎只被调用一次

Posted

技术标签:

【中文标题】onPostExecute() 似乎只被调用一次【英文标题】:onPostExecute() seems to be called only once 【发布时间】:2019-07-29 08:45:20 【问题描述】:

我创建了class,它扩展了AsyncTask,以与服务同步。同步完成后,我想将时间 (hh:mm) 放入TextView,以通知用户上次同步的时间。我在 onPostExecute() 里面做。 问题是这种情况只发生一次。 TextView 稍后不会更新。 我很确定 doInBackground() 正在被调用,因为它需要很长时间才能同步,就像应用程序启动时一样(有很多记录),但我不能 100% 确定,因为数据收集不会改变完全没有。 那是我的AsyncTask 班级:

private class Reconnect extends AsyncTask<String, Void, Void>

        private RotateAnimation anim = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);

        @Override
        protected void onPreExecute() 
            rlRefresh.setEnabled(false);
            anim.setInterpolator(new LinearInterpolator());
            anim.setRepeatCount(Animation.INFINITE);
            anim.setDuration(700);
            refreshIV.startAnimation(anim);
        



        @Override
        protected Void doInBackground(String... strings) 
            retrofit2.Call<List<ServiceTaskAxapta>> call = api.getTasks("1", strings[0]);
            retrofit2.Response<List<ServiceTaskAxapta>> response = null;
            try 
                response = call.execute();
             catch (IOException e) 
                e.printStackTrace();
            

            if(response.code() != 200)
                Toast.makeText(context, "Error 1", Toast.LENGTH_SHORT).show();
             else 

                for (int i = 0; i < response.body().size(); i++)
                    String endTime = DateParser.increaseTimeString(response.body().get(i).getReportTime(), 8, 0, false, null, null, null);

                    allTasksDB.insertIntoDB(response.body().get(i).getTaskID(), "path", response.body().get(i).getStreet(), response.body().get(i).getCity(), response.body().get(i).getPhoneNumber(),
                            response.body().get(i).getCompanyName(), Integer.parseInt(response.body().get(i).getReportDay()), Integer.parseInt(response.body().get(i).getReportMonth()),
                            Integer.parseInt(response.body().get(i).getReportYear()), Integer.parseInt(response.body().get(i).getDeadlineDay()), Integer.parseInt(response.body().get(i).getDeadlineMonth()),
                            Integer.parseInt(response.body().get(i).getDeadlineYear()), response.body().get(i).getReportTime(), endTime);
                

            

            call = api.getTasks("2", strings[0]);
            response = null;
            try 
                response = call.execute();
             catch (IOException e) 
                e.printStackTrace();
            

            if(response.code() != 200)
                Toast.makeText(context, "Error 2", Toast.LENGTH_SHORT).show();
             else 
                for (int i = 0; i < response.body().size(); i++)
                    String endTime = DateParser.increaseTimeString(response.body().get(i).getStartTimeMax(), 24, 0,false, null, null, null);

                    acceptedTasksDB.insertIntoDB(response.body().get(i).getTaskID(), "path", response.body().get(i).getStreet(), response.body().get(i).getCity(), response.body().get(i).getPhoneNumber(),
                            response.body().get(i).getCompanyName(), Integer.parseInt(response.body().get(i).getDeadlineDay()), Integer.parseInt(response.body().get(i).getDeadlineMonth()),
                            Integer.parseInt(response.body().get(i).getDeadlineYear()), Integer.parseInt(response.body().get(i).getAcceptedDay()), Integer.parseInt(response.body().get(i).getAcceptedMonth()),
                            Integer.parseInt(response.body().get(i).getAcceptedYear()), response.body().get(i).getStartTime(), endTime, response.body().get(i).getStartTimeMax(), false, false,
                            null, null);
                
            

            call = api.getTasks("3", strings[0]);
            response = null;
            try 
                response = call.execute();
             catch (IOException e) 
                e.printStackTrace();
            

            if(response.code() != 200)
                Toast.makeText(context, "Error 3", Toast.LENGTH_SHORT).show();
             else 
                for (int i = 0; i < response.body().size(); i++)

                    acceptedTasksDB.insertIntoDB(response.body().get(i).getTaskID(), "path", response.body().get(i).getStreet(), response.body().get(i).getCity(), response.body().get(i).getPhoneNumber(),
                            response.body().get(i).getCompanyName(), Integer.parseInt(response.body().get(i).getDeadlineDay()), Integer.parseInt(response.body().get(i).getDeadlineMonth()),
                            Integer.parseInt(response.body().get(i).getDeadlineYear()), Integer.parseInt(response.body().get(i).getAcceptedDay()), Integer.parseInt(response.body().get(i).getAcceptedMonth()),
                            Integer.parseInt(response.body().get(i).getAcceptedYear()), response.body().get(i).getStartTime(), null, response.body().get(i).getStartTimeMax(), true, false,
                            null, null);
                
            

            call = api.getTasks("4", strings[0]);
            response = null;
            try 
                response = call.execute();
             catch (IOException e) 
                e.printStackTrace();
            

            if(response.code() != 200)
                Toast.makeText(context, "Error 4", Toast.LENGTH_SHORT).show();
             else 
                for (int i = 0; i < response.body().size(); i++)

                    acceptedTasksDB.insertIntoDB(response.body().get(i).getTaskID(), "path", response.body().get(i).getStreet(), response.body().get(i).getCity(), response.body().get(i).getPhoneNumber(),
                            response.body().get(i).getCompanyName(), Integer.parseInt(response.body().get(i).getDeadlineDay()), Integer.parseInt(response.body().get(i).getDeadlineMonth()),
                            Integer.parseInt(response.body().get(i).getDeadlineYear()), Integer.parseInt(response.body().get(i).getAcceptedDay()), Integer.parseInt(response.body().get(i).getAcceptedMonth()),
                            Integer.parseInt(response.body().get(i).getAcceptedYear()), response.body().get(i).getStartTime(), null, response.body().get(i).getStartTimeMax(), true, true,
                            null, null);
                
            

            call = api.getTasks("5", strings[0]);
            response = null;
            try 
                response = call.execute();
             catch (IOException e) 
                e.printStackTrace();
            

            if(response.code() != 200)
                Toast.makeText(context, "Error 5", Toast.LENGTH_SHORT).show();
             else 
                dbConnectionProblems.open();
                for (int i = 0; i < response.body().size(); i++)

                    acceptedTasksDB.insertIntoDB(response.body().get(i).getTaskID(), "path", response.body().get(i).getStreet(), response.body().get(i).getCity(), response.body().get(i).getPhoneNumber(),
                            response.body().get(i).getCompanyName(), Integer.parseInt(response.body().get(i).getDeadlineDay()), Integer.parseInt(response.body().get(i).getDeadlineMonth()),
                            Integer.parseInt(response.body().get(i).getDeadlineYear()), Integer.parseInt(response.body().get(i).getAcceptedDay()), Integer.parseInt(response.body().get(i).getAcceptedMonth()),
                            Integer.parseInt(response.body().get(i).getAcceptedYear()), response.body().get(i).getStartTime(), null, response.body().get(i).getStartTimeMax(), true, false,
                            null, null); 


                    dbConnectionProblems.insertIntoDB(response.body().get(i).getTaskID(), true, null, null, null, null);
                
                dbConnectionProblems.close();
            
            return null;
        

        @Override
        protected void onPostExecute(Void aVoid) 
            if(!anim.hasEnded())

                refreshIV.setAnimation(null);
            
            String lastSynchro = calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + "@" + calendar.get(Calendar.DAY_OF_MONTH) + "-" + (calendar.get(Calendar.MONTH)-1) + "-" + calendar.get(Calendar.YEAR);
            ProjectStuff.saveLastSynchro(lastSynchro, context);

            String synchroTime = "Last synchro: " + DateParser.parseTime(context, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE));
            tvSynchroInfo.setText(synchroTime);
            rlRefresh.setEnabled(true);

        
    

execute() 方法:

rlRefresh.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                Reconnect refreshEvent = new Reconnect();
                refreshEvent.execute("12");
            
        );

经过一段时间(需要同步),胺化停止,所以看起来 onPostExecute() 被调用,并且 TextView 被更新,但以后的每次调用都不会更新它。

【问题讨论】:

你如何使用这个类? 如果您呼叫execute() 一次,那么onPostExecute 将被呼叫一次。确保被调用的东西尝试调试.. 此外,您不需要愚蠢的AsynCTask 来使用 Retrofit。Retrofit 调用已经是异步的,您可以直接从主线程调用它。 你能在你的主类中发布这个类的使用吗?可能是您在主要活动范围之外创建了一个新的 Asynctask,这就是您无法更新 textview 的原因。 我已经编辑了我的帖子。我只是在onClick() 中创建新实例并调用execute() 另外execute()不是异步的,所以不能从主线程调用。 【参考方案1】:

好的,我找到了问题所在。我在onCreate() 方法中调用了calendar = Calendar.getInstance(),我应该在保存它之前在onPostExecute() 中完成此操作,并在TextView 中显示它以获得正确的时间。

【讨论】:

以上是关于onPostExecute() 似乎只被调用一次的主要内容,如果未能解决你的问题,请参考以下文章

setNeedsDisplay 只被调用一次

didSelectRowAtIndexPath 只被调用一次

viewWillAppear 只被调用一次[重复]

KnockoutJs - 为啥初始化绑定处理程序只被调用一次?

为啥析构函数被调用两次而构造函数只被调用一次?

onPostExecute() 无法重新运行从活动调用的 asyncTask