asyncTask 中的对象侦听器和发布更新 (Android)



我在安卓开发方面很新(只有 2 个月)我正在尝试创建一个接收用户 ID 并创建用户对象的asyncTask,并在完成后替换片段。一切都很顺利,直到我尝试添加发布更新。

在我的用户对象中,它在创建用户时创建 days 对象,我希望asyncTast根据到目前为止创建的天数更改textView文本。

所以我在我的 User 对象中创建了一个接口,该接口每次创建一天时都会调用dayCreated()函数,并将到目前为止的天数传递给它。

doInBackgroundasyncTask里,我试图设置侦听器并每次都拨打publishUpdates,但它崩溃了。

这是我AsyncTask代码:

class CreateUserTask extends AsyncTask<Integer, Integer, User> {
    private int uid = -1;
    @Override
    protected User doInBackground(Integer... params) {
        uid = params[0];
        try {
            User user;
            user = new User(MainActivity.this, uid);
            user.setEventHandler(new User.EventHandler() {
                @Override
                public void dayCreated(int dayCounter) {
                    publishProgress(dayCounter);
                }
            });
            return user;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPreExecute() {
        fragmentsReplace(loadingFragment, "Loading");
    }
    @Override
    protected void onPostExecute(User userRecieved) {
        if(userRecieved != null) {
            fragmentsReplace(mainFragment, TAG_MAIN_FRAGMENT);
            user = userRecieved;
            login();
        }
        else{
            fragmentsReplace(loginFragment, TAG_LOGIN_FRAGMENT);
        }
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        loadingFragment.setDayCounter(values[0]);
    }
}

在我的 User 对象中,这就是我使用接口调用的方式:

int dayCounter = 0;
        Cursor result = myDataBase.getDaysData(this.uid);
        while (!result.isAfterLast()) {
            try {
                Calendar date = Calendar.getInstance();
                date.setTimeInMillis(Long.parseLong(result.getString(result.getColumnIndex(DataBaseHelper.DB_DATE_COLUMN))));
                DayOfWork day = new DayOfWork(this.uid, date, this.context);
                this.daysOfWorkArray.add(day);
                dayCounter++;
                eventHandler.dayCreated(dayCounter++);
            }catch (Exception e)
            {
                Log.e("error" , e.getMessage());
            }
            result.moveToNext();

和事件处理程序代码:

EventHandler eventHandler = null;
public interface EventHandler{
    void dayCreated(int dayCounter);
}
public void setEventHandler(EventHandler eventHandler){
    this.eventHandler = eventHandler;
}

publishProgress() 是否与 UI 中的任何内容交互?如果是这样,您的问题是您从异步任务中的后台线程调用它。所有 UI 交互都需要在主/UI 线程上执行。

最新更新