简体   繁体   English

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

[英]Object listener inside asyncTask and publish updates (Android)

I am pretty new at android developing(only 2 months) I am trying to create an asyncTask which receives a user id and creates the user object, and after it finishes to replace fragment. 我在android开发领域asyncTask (仅2个月),我试图创建一个asyncTask来接收用户ID并创建用户对象,并在其完成替换片段之后。 every thing went well, until I tried to add publish updates. 一切顺利,直到我尝试添加发布更新。

Inside my user object it creates days object when creating the user, I want the asyncTast to change textView text according to the number of days created so far. 在我的用户对象它创建天对象创建用户的时候,我想asyncTast改变textView根据创建至今的天数文本。

So I created an interface inside my User object which call dayCreated() function everytime day is created and pass to it the number of days so far. 因此,我在User对象中创建了一个接口,该接口在每次创建日期时都调用dayCreated()函数,并将到目前为止的天数传递给该接口。

Inside my asyncTask in doInBackground I tried to set the listener and call publishUpdates each time but it crashes. asyncTaskdoInBackground内部,我尝试设置侦听器并每次都调用publishUpdates但它崩溃了。

Here is my AsyncTask code: 这是我的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]);
    }
}

And inside my User object this is how I call using interface: 在我的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();

And the eventHandler code: 和eventHandler代码:

EventHandler eventHandler = null;

public interface EventHandler{
    void dayCreated(int dayCounter);
}

public void setEventHandler(EventHandler eventHandler){
    this.eventHandler = eventHandler;
}

Does publishProgress() interact with anything in your UI? publishProgress()是否与用户界面中的任何内容交互? If so your issue is that you're calling it from a background thread in your async task. 如果是这样,您的问题是您正在异步任务中从后台线程调用它。 All UI interactions need to execute on the main/UI thread. 所有UI交互都需要在main / UI线程上执行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM