2014-10-09 4 views
1

Я разрабатываю приложение для 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, и я думаю, что это потому, что я плохо управляю своим диалоговым окном.

Как я могу правильно управлять своим диалоговым окном прогресса, чтобы избежать просочившихся окон?

Надеюсь, что кто-нибудь может мне помочь, спасибо заранее.

ответ

0

Предположим, что проблема заключается в диалоге прогресса, вы можете попытаться использовать один из методов статического показа. Следующий код убеждается, что диалог прогресс не двойной или тройной показ:

if (progressDialog == null || !progressDialog.isShowing()) { 
    progressDialog = ProgressDialog.show(activity, "Changing password ...", "Please wait.", true, false); 
} 

И вы определяете:

private ProgressDialog progressDialog; 

 Смежные вопросы

  • Нет связанных вопросов^_^