我在安卓开发方面很新(只有 2 个月)我正在尝试创建一个接收用户 ID 并创建用户对象的asyncTask
,并在完成后替换片段。一切都很顺利,直到我尝试添加发布更新。
在我的用户对象中,它在创建用户时创建 days 对象,我希望asyncTast
根据到目前为止创建的天数更改textView
文本。
所以我在我的 User 对象中创建了一个接口,该接口每次创建一天时都会调用dayCreated()
函数,并将到目前为止的天数传递给它。
在doInBackground
的asyncTask
里,我试图设置侦听器并每次都拨打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 线程上执行。