마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask가 죽어서 RxJava나 kotlin으로 바꾸고싶은데 도와주세요

0 추천

AsyncTask로  회원관리 하는 어플을 만들려고 했는데 30버전 이상부터는 못쓴다고 하더라고요. 그러면 RxJava나 needle kotlin 으로 바꿔야하는데 도저히 변경방법을 모르겠어요. 구글 검색해도 간단한 예제 하나 던져주고 끝나서 저는 서버에서 정보를 땡겨오는거라 영 이해가안되네요... 구동하고 싶은건 btn_user 버튼 누르면 고객관리 페이지로 넘어가고 php 파일을 통해 mysql의 userlist 데이터를 불러오는 겁니다. 진짜 이거 왜 지원안해주는지 이해가안되네요 이렇게 좋은 시스템을..

public class MainActivity extends AppCompatActivity {

    private TextView tv_id, tv_pass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_id = findViewById(R.id.tv_id);
        tv_pass = findViewById(R.id.tv_pass);

        Button btn_user = (Button) findViewById(R.id.btn_user);

        Intent intent = getIntent();
        String id = intent.getStringExtra("id");
        String pass = intent.getStringExtra("pass");

        tv_id.setText(id);
        tv_pass.setText(pass);

        if(!id.equals("admin"))
        {
            btn_user.setVisibility(View.GONE);
        }
//--------------------------------------------------------------------------------
        btn_user.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                new BackgroundTask().execute();
            }
        });
    }

    class BackgroundTask extends AsyncTask<Void, Void, String> {
        String target;

        @Override
        protected void onPreExecute() {
            target = "http://IP/userlist.php";
        }

        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url = new URL(target);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String temp;
                StringBuilder stringBuilder = new StringBuilder();
                while ((temp = bufferedReader.readLine()) != null) {
                    stringBuilder.append(temp + "\n");
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return stringBuilder.toString().trim();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            Intent intent = new Intent(MainActivity.this, ManagementActivity.class);
            intent.putExtra("userList", result);
            MainActivity.this.startActivity(intent);
        }
    }
//--------------------------------------------------------------------------------
}
saluk (170 포인트) 님이 2022년 4월 27일 질문

2개의 답변

0 추천
 
채택된 답변
AsyncTask는 비교적 짧은 백그라운드처리를 한 다음 메인쓰레드로 전환할 수있는 클래스입니다. 그래서 구현도 비교적 간단하구요. 하지만 더 좋은 대안들이 이미 많이 나왔고 많이 제한적입니다. 예를 들면 시간이 좀 걸리는 백그라운드 작업은 할 수 없고한개 이상의 백그라운드 처리를 동시에 하기가 쉽지 않죠. 작업최소같은 것도 원할하지 않구요.

Retrofit이 가장 많이 쓰이는 라이브러리입니다. Retrofit 2.6부터 Coroutine이 지원됩니다. RxJava는 이미 훨씬 전부터 지원이 되구요. 개인적으로는 RxJava나 Coroutine이나 둘다 복잡하지만, 쓸 수 있을 만큼 되기 까지는 RxJava가 좀 더 오래 걸린다고 생각합니다. 둘다 제대로 이해를 못하고 사용하면 간단한 경우에는 문제가 없지만, API를 여러개 호출한다던가 하나 호출하고 다른걸 호출한다던가, 예러처리 등등에 어려움이 생기거나 문제가 되는 코드를 작성할 소지가 좀 있습니다. 하나씩 공부하시면 해가셔도 되구요. 우선 해볼만한 옵션은 Retrofit의 콜백을 사용하는 겁니다.  여기에서는 원하시는 내용을 다 보여주기에는 한계가 있으므로 링크를 남길게요. 많이 읽고 따라하시길 바랍니다.

아래가 해당  API이구요.

https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html

아래 사이트 가시면 바로 사용해볼 수 있는 튜토리얼들이 많이 있습니다.

https://futurestud.io/tutorials/retrofit-getting-started-and-android-client
spark (227,470 포인트) 님이 2022년 4월 27일 답변
saluk님이 2022년 5월 4일 채택됨
0 추천
https://github.com/mcsong/AdvancedAsyncTask 로 간단하게 바꾸실 수 있습니다.

자바를 사용하시면, WorkManager를 사용하시면 됩니다.
mcsong (44,040 포인트) 님이 2022년 4월 27일 답변
...