[英]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. 在asyncTask
的doInBackground
内部,我尝试设置侦听器并每次都调用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.