-
안드로이드 asynctaskAndroid/AndroidStudio 2018. 12. 3. 16:37
ASYNcTASK
UI에 접근하기 위해 핸들러를 사용하기 복잡하다면 구글에서 제공하는 AsyncTask를 사용할 수 있습니다. AsyncTask를 상속받은 클래스를 정의하고 Main Thread에서 객체를 생성합니다. AsyncTask를 상속한 클래스에서 onInBackground(), onProgressUpdate(), onPostExecute()메소드를 재정의 하면 Thread생성과 Handler 없이 위의 작업을 진행 할 수 있습니다. AsynkTask를 상속받은 객체의 execute() 메소드를 실행하면 Thread가 실행되고 순서대로 onInBackground(), onProgressUpdate(), onPostExecute() 메소드가 실행됩니다. 클래스를 생성시 세가지 type을 정의할 수 있으며 순서대로 onInBackground, onProgressUpdate(), onPostExecute() 메소드에 인자로 받아들여지는 데이터의 타입을 정의하는 것입니다.
onInBackground()에서 실행할 코드를 오버라이드 하고 publishProgress()메소드를 호출하며 매개변수를 전달하면, onProgressUpdate()가 실행됩니다.
onProgressUpdate()에서는 UI에 접근할 수 있습니다. publishProgress가 호출될때 마다 실행됩니다.
onPostExecute()는 onInBackground의 return 값을 받습니다. 역시 UI에 접근 할 수 있으며, 쓰레드가 끝날때 실행됩니다.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressBar = (ProgressBar) findViewById(R.id.progressBar); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProgressTask task = new ProgressTask(); task.execute("시작"); } }); } class ProgressTask extends AsyncTask<String, Integer, Integer> { int value =0; @Override protected Integer doInBackground(String... strings) { while(true){ if(value > 100){ break; } value += 1; publishProgress(value); // onProgressUpdate() try{ Thread.sleep(200); }catch(Exception e){} } return value; } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); Toast.makeText(getApplicationContext(), "완료됨", Toast.LENGTH_LONG).show(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); progressBar.setProgress(values[0].intValue()); } }
https://www.edwith.org/boostcourse-android/lecture/17087/
SOCKET
네트워크간 연결을 하기위해 여러가지 통신 규약이 필요합니다. socket은 어플에서 하부구조로(7layer)로 내려가는 통로를 의미합니다.(자세한 내용은 네트워크와 관련되어 있기 때문에 생략합니다. 간단하게 네트워크에서 내컴퓨터의 이름은 IP, 프로그레스 이름은 socket이 되는 겁니다.) 서버소켓을 이용하여 서버와 클라이언트를 만들 수 있습니다.
먼저 serverSocket 객체를 만듭니다. 객체를 생성하게 되면 서버가 생성됩니다. accept()메소드를 실행하면 socket 객체를 리턴받을 수 있습니다. 리턴받은 socket 객체에서 getInputStream()을 통해 inpuStream 객체를 리턴받아 ObjectInputStream 객체를 생성하면, 전달받은 데이터를 얻을 수 있습니다.
마찬가지로 getOutputStream() 객체를 리턴받아 ObjectOutputStream 객체를 생성하면 writeObject() 메소드를 통해 전달할 데이터를 만들 수 있습니다. 마지막으로 스트림에 데이터가 남아 있을 수 있기 때문에 flush()를 해줍니다. 소캣의 연결이 끝고 싶으면 close()메소드를 실행합니다.
class ServerThread extends Thread{ public void run(){ int port = 5001; try { ServerSocket server = new ServerSocket(port); Log.d("ServerThread", "서버가 실행됨"); while(true){ Socket socket = server.accept(); ObjectInputStream instream = new ObjectInputStream( socket.getInputStream()); Object input = instream.readObject(); Log.d("serverThread", "input" + input); ObjectOutputStream outstream = new ObjectOutputStream(socket.getOutputStream()); outstream.writeObject(input + "from server."); outstream.flush(); Log.d("serverThread", "output sended."); socket.close(); } }catch(Exception e){ e.printStackTrace(); } } }
클라이언트 또한 비슷한 방법으로 데이터를 전송할 수 있습니다. host의 주소와 port 넘버를 매개변수로 Socket()을 생성합니다. 데이터를 보내고 받는 방법은 서버소켓에서 했던 내용과 같습니다.
네트워크를 사용하기 위해서는 매니페스트에 항상 인터넷 권한을 설정해 주어야 합니다.
서버 처럼 항상 돌아가야하는 것을 스레드로 만들경우 쓰레드가 실행되고 있는 액티비티에 따라 쉽게 사라질 수있기 때문에, 서비스에 구현하는 것이 좋습니다.
<uses-permission android:name="android.permission.INTERNET" />
'Android > AndroidStudio' 카테고리의 다른 글
안드로이드 httpUrlConnection, Volley (0) 2018.12.03 커스텀 리스트뷰 (0) 2018.11.07 MVP MVVM 모델을 활용한 안드로이드 설계 (0) 2018.10.08 안드로이드 thread와 handler (0) 2018.07.07 Android Guideline (0) 2018.07.02