2015-03-13 3 views
2

Я пишу здесь, потому что это мое последнее решение для понимания этого типа программирования. Проблема в том, что я застрял в том, что использовать для обработки соединения с сервером и входа в систему. Должен ли я использовать async-задачу, обработчик или поток? Я не нашел конкретного ответа о том, какой из них использовать, только обнаружил, что асинхронная задача используется для загрузки изображений или других загружаемых материалов.Лучший способ сделать экран входа в систему

До сих пор я использовал поток для подключения к серверу. Проблема, с которой я столкнулась, заключалась в том, когда я поймаю исключение (поместите неверное имя пользователя/пароль) и попробуйте снова войти в систему. (Мне нужно было «закрыть» последний поток и снова запустить его)

После этого я начал использовать асинхронную задачу, но я действительно не понимаю, как это должно работать, и я застрял на тосте неправильного имени пользователя/пароля ,

private class connectStorage extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      api = DefaultClientFactory.create(host, getUser, getPassword); 
      if (api.getAuthToken().trim().length() > 3) { 
       //TO DO LAYOUT CHANGE; 
      } 
     } catch (StorageApiException e) { 
      e.printStackTrace(); 
      Log.i("TEST", "" + e.getMessage()); 
     } 
     return null; 
    } 

Кроме того, я 100% уверен, что вызов раздуть в методе doInBackground не будет работать тоже (там я хотел изменить свою деятельность).

Я запускаю задачу async при нажатии кнопки.

ответ

1

При использовании AsyncTask Вы doInBackground и onPostExecute Так в основном получить JSON или строку или логическое значение в качестве результата от doinbackground и onpostexecute проверки, если Войти в успешном или нет, если его успешных сохранить данные с сервера и начните намерение перейти к другому действию или подтолкнуть пользователя, что данные этого пользователя не совпадают и повторите попытку.

Так что ваш AsyncTask может быть внутренний класс вашего класса активности, который Логин и кнопка onClickSubmit вызвать класс AsyncTask и на пост выполнить разбор JSON и в зависимости от результата решить, что делать

Пример:

public class SignInAsycTask extends AsyncTask<RequestParams, Void, String> { 

    @Override 
    protected String doInBackground(RequestParams... params) { 
     return new HttpManager().sendUserData(params[0]); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     String[] details = parseJsonObject(result); 
     if (details != null) { 
      user.setUser_id(Integer.valueOf(details[0])); 
      user.setName(details[1]); 
      if (details.length > 2) { 
       user.setProfilePic(details[2]); 
      } 
      setSharedPreferences(); 
      startActivity(new Intent(Signin.this, MainActivity.class)); 
      finish(); 
     } else { 
      Toast.makeText(Signin.this, "please try again", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

public String[] parseJsonObject(String result) { 
    JSONObject obj = null; 
    try { 
     obj = new JSONObject(result); 
     if (obj.has("success")) { 
      if (obj.getInt("success") == 1) { 
       if (obj.has("user_pic")) { 
        return new String[] { 
          String.valueOf(obj.getInt("user_id")), 
          obj.getString("user_name"), 
          obj.getString("user_pic") }; 
       } else { 
        return new String[] { 
          String.valueOf(obj.getInt("user_id")), 
          obj.getString("user_name"), }; 
       } 
      } else { 
       return null; 
      } 
     } else { 
      return null; 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
     return null; 
    } 

} 

здесь мои RequestParams только объект, где я сохранил все детали, такие как параметры URL для отправки и т.д., и выхода doinbackground является строкой, и я разбор его в моем методе postexecute

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