我目前正在开发一款将日历作为其活动之一的Android应用。我的日历工作正常,但我有以下问题:
每个月我都要向API请求事件(我使用AsyncHttpClient来实现这一点),因此每次用户点击按钮查看下个月或上个月时,我都会发出新请求,数据异步并将其保存到数据库中。我正确的做法是为每个新请求启动一个新意图,但这是错误的,因为每次我点击查看不同的月份,如果我点击后退按钮我有一堆相同的实例活动,但我刚看到前几个月。
我真正想做的是"刷新" CalendarActivity包含我刚从请求中获得的新数据,但我不确定如何执行此操作。我尝试将标志FLAG_ACTIVITY_NEW_TASK添加到我意图的标志中,但它没有做我期望的事情。我也尝试放入ProgressDialog并等待请求完成但问题是我在发出请求后仍然执行statActivity,但我不知道我还能做到这一点。
以下是我的一些代码,特别是在请求完成后我获得的代码并且成功了:
AsyncHttpClientManager.java
public static void getCalendar(final int year, final int month,
final Context context, final Context appContext,
final ProgressDialog prgDialog) {
prgDialog.show();
cookieStore = new PersistentCookieStore(appContext);
// Change the default timeout from 10secs to 30secs
// Calendar takes time to load
client.setTimeout(DEFAULT_TIMEOUT);
client.setCookieStore(cookieStore);
client.addHeader("Accept", HEADER);
RequestParams params = new RequestParams();
String[] dates = getDate(year, month);
Log.d(TAG, "start: " + dates[0] + " end: " + dates[1]);
params.put("start_date", dates[0]);
params.put("end_date", dates[1]);
client.get(getAbsoluteUrl(CALENDAR_PATH), params,
new JsonHttpResponseHandler() {
@Override
public void onFailure(int statusCode,
org.apache.http.Header[] headers,
java.lang.String responseString,
java.lang.Throwable throwable) {
prgDialog.hide();
.....
}
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
if (statusCode == 200) {
prgDialog.hide();
Gson gson = new Gson();
Calendar calendar = gson.fromJson(
response.toString(), Calendar.class);
CalendarController.getInstance(context);
CalendarController.insertCalendar(calendar);
Intent intentC = new Intent(context,
CalendarActivity.class);
java.util.Calendar current = java.util.Calendar
.getInstance();
if (current.get(java.util.Calendar.MONTH) + 1 == month
&& current.get(java.util.Calendar.YEAR) == year) {
intentC.putExtra("first_time", true);
} else {
intentC.putExtra("first_time", false);
intentC.putExtra("month", month);
intentC.putExtra("year", year);
}
context.startActivity(intentC);
}
}
});
}
单击按钮查看下一个月或上个月时的onClick()方法:
CalendarActivity.java
@Override
public void onClick(View v) {
if (v == prevMonth) {
if (month <= 1) {
month = 12;
year--;
} else {
month--;
}
AsyncHttpClientManager.getCalendar(year, month, this,
getApplicationContext(), prgDialog);
setGridCellAdapterToDate(month, year);
}
if (v == nextMonth) {
if (month > 11) {
month = 1;
year++;
} else {
month++;
}
prgDialog.show();
AsyncHttpClientManager.getCalendar(year, month, this,
getApplicationContext(), prgDialog);
setGridCellAdapterToDate(month, year);
}
}
我还尝试在发出请求之前完成CalendarActivity,但请求需要一些时间,以便当前的CalendarActivity完成,让我回到之前的活动,几秒钟后,CalendarActivity的新实例就会启动。
希望任何人都可以帮助我。提前致谢。