Я разрабатываю приложение для Android.Правильно управляйте ProgressDialog в задачах AsyncHttpClient, чтобы избежать просочившихся окон Android
Мне нужно сделать несколько запросов на сервер из моего приложения, поэтому я использую AsyncHttpClient.
Часть моего приложения имеет профиль пользователя и временную шкалу, чтобы показать некоторые события. Когда пользователь входит в систему, мне нужно получить их информацию о профиле и информацию о их временной шкале и сделать это. Мне нужно сделать 3 разных запроса на сервер:
1-й запрос: Войти -> Сохранить файлы cookie и сеанс информация в SharedPreferences 2nd Request: Получить профиль -> Сохранить личную информацию пользователя. Третий запрос: получить временную шкалу пользователя -> Сохранить сообщения и события, связанные с текущим пользователем.
Вот мой запрос Логин:
public static void login(final String email, final String password,
final Context context, final Context appContext, final Resources res) {
prgDialog = new ProgressDialog(context);
prgDialog.setMessage(res.getString(R.string.dialog_please_wait));
prgDialog.setCancelable(false);
prgDialog.show();
cookieStore = new PersistentCookieStore(appContext);
client.setCookieStore(cookieStore);
RequestParams params = new RequestParams();
params.put("user_session[email]", email);
params.put("user_session[password]", password);
client.addHeader("Accept", HEADER);
client.post(getAbsoluteUrl(LOGIN_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();
if (statusCode == 404) {
Toast.makeText(context,
res.getString(R.string.error_404),
Toast.LENGTH_LONG).show();
} else if (statusCode == 500) {
Toast.makeText(context,
res.getString(R.string.error_500),
Toast.LENGTH_LONG).show();
} else if (statusCode == 401) {
Toast.makeText(context,
res.getString(R.string.login_401),
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(
context,
"Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]",
Toast.LENGTH_LONG).show();
}
}
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
if (statusCode == 200) {
// In this case the JSONOBject has the user
// credentials, such as user_id, person_id
// user_instance_type and user_instance_id
// Parse them into an object that has the same
// attributes
Gson gson = new Gson();
UserCredentials userCredentials = gson.fromJson(
response.toString(), UserCredentials.class);
setInitialPrefs(userCredentials, appContext);
// Get the user profile and save into the
// database
getUserProfile(userCredentials.getUser_id(),
context, appContext, prgDialog);
// Get the timeline
getWalls(true, context, appContext, prgDialog);
}
}
});
}
оба метода, getUserProfile и getWalls сами по себе являются асинхронные запросы. Вот код:
public static void getUserProfile(int userId, final Context context,
final Context appContext, final ProgressDialog prgDialog) {
prgDialog.show();
cookieStore = new PersistentCookieStore(appContext);
client.setCookieStore(cookieStore);
client.addHeader("Accept", HEADER);
client.get(getAbsoluteUrl(USERS_PATH + userId),
new JsonHttpResponseHandler() {
@Override
public void onFailure(int statusCode,
org.apache.http.Header[] headers,
java.lang.String responseString,
java.lang.Throwable throwable) {
prgDialog.hide();
if (statusCode == 404) {
Log.d(TAG, "404 getting profile");
} else if (statusCode == 500) {
Toast.makeText(
context,
context.getResources().getString(
R.string.error_500),
Toast.LENGTH_LONG).show();
} else if (statusCode == 401) {
Log.d(TAG, "401 getting profile");
} else {
Log.d(TAG, "Error getting profile");
}
}
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
if (statusCode == 200) {
// In this case the JSONOBject has the user
// profile
// Parse them into an object that has the same
// attributes
Gson gson = new Gson();
UserProfile userProfile = gson.fromJson(
response.toString(), UserProfile.class);
UserProfileController profileController = new UserProfileController(
context);
profileController.insertProfile(userProfile);
}
}
});
}
public static void getWalls(final boolean firstTime, final Context context,
Context appContext, final ProgressDialog prgDialog) {
cookieStore = new PersistentCookieStore(appContext);
prgDialog.show();
client.setCookieStore(cookieStore);
client.addHeader("Accept", HEADER);
client.get(getAbsoluteUrl(WALLS_PATH), new JsonHttpResponseHandler() {
@Override
public void onFailure(int statusCode,
org.apache.http.Header[] headers,
java.lang.String responseString,
java.lang.Throwable throwable) {
prgDialog.hide();
if (statusCode == 404) {
Log.d(TAG, "404 getting walls");
} else if (statusCode == 500) {
Toast.makeText(
context,
context.getResources().getString(
R.string.error_500),
Toast.LENGTH_LONG).show();
} else if (statusCode == 401) {
Log.d(TAG, "401 getting walls");
} else {
Log.d(TAG, "Error getting walls");
}
}
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
if (statusCode == 200) {
Gson gson = new Gson();
TimelineController.getInstance(context);
Timeline timeline = gson.fromJson(response.toString(),
Timeline.class);
TimelineController.insertTimeline(timeline);
if (firstTime) {
prgDialog.hide();
Intent i = new Intent(context, TimelineActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
((AuthActivity) context).finish();
} else {
prgDialog.hide();
Intent i = new Intent(context, TimelineActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
}
}
}
});
}
Если вы видите код, что я пытаюсь сделать с помощью диалога прогресса должна держать это показано до последнего запроса отделка (по просьбе getWalls)
Вещи есть, иногда когда я выхожу из системы и снова вхожу в систему с тем же или другим пользователем, я получаю исключение android.view.WindowLeaked, и я думаю, что это потому, что я плохо управляю своим диалоговым окном.
Как я могу правильно управлять своим диалоговым окном прогресса, чтобы избежать просочившихся окон?
Надеюсь, что кто-нибудь может мне помочь, спасибо заранее.