1. 준비물
이번엔 register 기능을 구현할 것입니다.
먼저 몇가지를 import하겠습니다. 그 중 okhttp3의 mediatype을 이용할 것입니다. 나머지는 유저 등록을 위한 모델들입니다.
import com.example.keepair.myapplication.apiservice.RegistrationApiService; import com.example.keepair.myapplication.helper.Constants; import com.example.keepair.myapplication.loginhelper.ReferSharedPreference; import com.example.keepair.myapplication.model.MyKey; import okhttp3.MediaType; | cs |
이렇게 하면 requestBody를 따로 만들 수 있게 됩니다. okhttp의 requestBody를 만들기 위해 MediaType이 필요합니다. request의 POST 요청을 위해 사용하는 것입니다.
필요한 정보를 가져옵니다. 저장되어있는 정보도 괜찮고 새로 불러올 정보도 괜찮습니다.
MyKey keygoven; RegistrationApiService mRegistrationApiService; EditText mUsernameRegistrationEditText; EditText mPasswordRegistration1EditText; EditText mPasswordRegistration2EditText; ImageView mRegisterButton; RelativeLayout mLayoutRegstration; ReferSharedPreference mSavedUserInfo; | cs |
저는 SharedPreference 의 변형인 ReferSharedPreference를 쓸 것입니다.
2. 함수 구현
그 다음 onCreate를 작성합니다.
@Override protected void onCreate(Bundle savedInstanceState) { } | cs |
여기 안에 필요한 코드들을 넣겠습니다.
super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_registration); Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); int width = (int) (display.getWidth() * 0.999); //Display 사이즈 int height = (int) (display.getHeight() * 0.9); //Display 사이즈 getWindow().getAttributes().width = width; getWindow().getAttributes().height = height; | cs |
이렇게 하면 기본 Activity의 사이즈를 정하게 됩니다. display 되는 사이즈라고 생각하면 됩니다. 안드로이드 화면의 크기를 조절하는 것입니다. getWidth()와 getHeight()를 사용했습니다. 지난 포스트에서는 0.7과 0.9를 사용했지만 이번엔 최대 크기를 잡기 위해 비율을 1에 가깝게 했습니다.
그 다음 레이아웃과 저장된 SharedPreference로부터 값을 불러와서 사용될 값으로 넣어주겠습니다.
mSavedUserInfo = new ReferSharedPreference(getApplicationContext()); mUsernameRegistrationEditText = (EditText) findViewById(R.id.et_username_registration); mPasswordRegistration1EditText = (EditText) findViewById(R.id.et_password_registration_1); mPasswordRegistration2EditText = (EditText) findViewById(R.id.et_password_registration_2); mRegisterButton = (ImageView) findViewById(R.id.btn_registration); mLayoutRegstration = (RelativeLayout) findViewById(R.id.layoutRegistration); | cs |
유저 등록에 필요한 정보들은 모두 가져오게 되었습니다. 그 다음엔 이걸 POST요청으로 전송할 수 있게 onClickListener()를 작성합니다.
final String givenRegistrationUserName = mUsernameRegistrationEditText.getText().toString(); final String givenRegistrationPassword1 = mPasswordRegistration1EditText.getText().toString(); String givenRegistrationPassword2 = mPasswordRegistration2EditText.getText().toString(); String givenEmail = ""; | cs |
쓸 값들을 변수에 넣어서 준비합니다. okhttp client에서 사용될 것입니다.
그 다음엔 조건에 맞는다면 전송하는 부분을 작성합니다. 항상 등록을 허가할 순 없으니 조건을 구성합니다. if문을 사용했습니다.
if(givenRegistrationUserName.length() >= 3){ if(givenRegistrationPassword1.equals(givenRegistrationPassword2)){ } } | cs |
username의 길이와 password의 일치여부를 확인한 후 둘 다 True면 실행되는 코드입니다.
OkHttpClient client = new OkHttpClient(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); client = builder.build(); Retrofit retrofit = new Retrofit.Builder() .client(client) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(Constants.BASE_URL) .build(); mRegistrationApiService = retrofit.create(RegistrationApiService.class); | cs |
Api Client를 만듭니다. 그리고 request 보내기 전 데이터를 수집합니다. Retrofit가 편리하게 사용됩니다.
RequestBody username = RequestBody.create( MediaType.parse("multipart/form-data"), givenRegistrationUserName); RequestBody email = RequestBody.create( MediaType.parse("multipart/form-data"), givenEmail); RequestBody password1 = RequestBody.create( MediaType.parse("multipart/form-data"), givenRegistrationPassword1); RequestBody password2 = RequestBody.create( MediaType.parse("multipart/form-data"), givenRegistrationPassword2); | cs |
사용자가 입력한 정보를 RequestBody에 넣어 서버로 전송할 것입니다. 이렇게 하면 requestBody 구성이 완료됩니다.
이제 직접 서버와 통신하는 부분을 작성하겠습니다. 지난 시간의 Call 요청을 좀 더 자세하게 구현합니다.
Call<ResponseBody> call = mRegistrationApiService.registersecond(username, email, password1, password2); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (response.isSuccessful()){ Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_LONG).show(); mSavedUserInfo.put("SavedUserName", givenRegistrationUserName); mSavedUserInfo.put("SavedPassword", givenRegistrationPassword1); Intent intent = new Intent(RegistrationActivity.this, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "Something wrong, Would you check password conditions?", Toast.LENGTH_LONG).show(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); | cs |
이렇게하여 Retrofit의 Call도 구현했습니다. 유저 등록이 끝나면 다시 LoginActivity로 이동하도록 intent를 만들었습니다. intent에서 현재의 activity를 효과적으로 제거할 수 있게 FLAG들을 사용했습니다.
이 다음엔 failure를 구현하면 됩니다. 위에선 response에서의 response.isSuccessful() 과 else가 있고 따로 onFailure()가 존재하지만 원하는 대로 작성하시면 됩니다.
'Java' 카테고리의 다른 글
[android] Adapter 만들기 1 (0) | 2018.02.04 |
---|---|
[android] GridLayout Activity 만들기 (0) | 2018.02.04 |
[android] butterknife 모듈을 이용한 LoginActivity 만들기 (0) | 2018.02.04 |
[android] Infinite Scroll 구현 예제 (0) | 2018.02.04 |
[utils] Bitmap 파일 다루는 데에 도움될 만한 유틸리티 함수 예제 (0) | 2018.02.03 |