IDE & Framework/Android

비동기(Async)통신과 동기(Sync)통신의 차이 feat. retrofit

Greensky0026 2021. 5. 8. 00:12
반응형

* 2020.7.20에 작성한 포스트입니다.


 

간단히 줄이자면, 아래와 같다.

동기 : 요청과 결과가 동시에 일어남. 요청시 시간이 얼마나 걸리던 결과를 받아야 함.
        설계가 간단하고 직관적이지만, 결과가 반환될때까지 대기해야 한다.

비동기 : 요청한다고 바로 결과가 주어지지 않음
           설계가 비교적 복잡한 편이지만, 멀티테스킹이 가능함

 

 retrofit2을 사용해서 통신하다가 삽질을 좀 했다.. 범인은 아래와 같다

    public boolean retrofit(final String email){
    	final int PASSED_PROCESS = 0
    	
        RetrofitService rs = RetrofitService.retrofit.create(RetrofitService.class);
        Call<String> call = rs.authEamilSend(email);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                if (!response.isSuccessful()) {
                    Toast.makeText(con, "fail to get response. try again",
                            Toast.LENGTH_SHORT).show();
                }
                if (!response.body().equals("")) {
                    Toast.makeText(con, "통신성공", Toast.LENGTH_SHORT).show();
                    PASSED_PROCESS = 1
                }
                else{
                    Toast.makeText(con, "통신실패", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Toast.makeText(con, "Connection error : " + t.toString(),
                        Toast.LENGTH_SHORT).show();
            }
        });
        
        if(PASSED_PROCESS = 1)
        	return true;
            
        return false;
    }

머리가 빈 상태로 저런식으로 모자라게 코드를 짰었는데... 아우.. 멍청이...ㅋㅋㅋㅋㅋㅋ

내 머릿속 : 헤헤 call.enqueue 수행하고 통신이 성공하면 참값을 리턴하겠지?
현실 : 어림도없지 enqueue 콜백 안기다리고 바로 거짓 리턴 ㅎㅎ

 Retrofit2는 기본적으로 OkHttp를 네트워킹 계층으로 활용하여 그 위에 구축하므로...
call.enqueue 대신 call.excute를 사용할수도 있다.

Call<String> StringData = call.execute().body():

아숑하면 StringData 변수 안에 동기적으로 데이터가 들어가게 된다.

 

근데 재활용 필요없이 해당 작업만 사용해서 쓸꺼면 이렇게 쓰는거보다 AsyncTask가 훨씬 편리하고 쉬운거 같다...ㅎㅎ 

private class DownloadFilesTask extends AsyncTask {
  @Override
  protected void onPreExecute() {
    super.onPreExecute();
    //작업전 실행되는 메서드 (다이얼로그를 띄운다던지..)
  }

  @Override
  protected String doInBackground(URL... urls) {
    //받은 URL을 통해 할 작업
    return total;
  }

  @Override
  protected void onProgressUpdate(Integer... progress) {
    //경과에 따른 페센테이지 작업
  }

  @Override
  protected void onPostExecute(String result) {
    //백그라운드 작업이 종료되고 받은 결과값으로 할 작업 입력
  }
  
}

하지만 deprecated 되었으니... ㅠㅠ

반응형