728x90

 

 

AsyncTask는 백그라운드 스레드 와 UI 스레드를 같이 쓰기 쉽게 설계했으며,

 

일반 스레드와 달리, 간단한 작업에 적합하게 만들었다고 설명되어 있다.

 

안드로이드에서의 일처리는 메인스레드(UI 스레드)가 담당한다. 특히 UI와 관련된( ex) TextView,ImageView )

 

일처리는 메인스레드만 담당 하게끔 설계를 했다. 그래서 메인스레드를 UI스레드라고도 불린다.

 

 

따라서 복잡한 계산은 백그라운드 스레드( 메인 스레드가 아닌 다른 스레드의 총칭)에 맡긴후 

 

계산된 결과값을 UI스레드에게 일을 시켜야 하는 것이다.

 

그래서 AysncTask 라는 객체를 만들었고 위에서 설명한 일들을 쉽게 구현 할 수 있도록 메서드를 제공한다.

 

아래의 AysncTask 예시를 보자.



import android.os.AsyncTask;

public class MommooAsyncTask extends AsyncTask<String,Void,String>{

public String result;

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
return result;
}

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

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}

 

AsyncTask 객체는 abstact로 선언되었다 따라서 사용을 위해서는 extends를통해 상속을 받아서 사용하여야 한다

 

@Override
    protected void onPreExecute() {
        super.onPreExecute();
    }



첫번째 메서드다. 해당 메서드는 이름에서 볼 수 있드시,  background스레드를 실행하기전 준비 단계이다.



변수의 초기화나, 네트워크 통신전 셋팅해야할 것들을 위의 메서드 공간에 작성한다. 





 @Override
    protected String doInBackground(String... params) {
        return result;
    }



두번째 메서드다. 해당 메서드가 background 스레드로 일처리를 해주는 곳이다.



보통 네트워크, 병행 일처리등을 위 메서드 공간에 작성한다.



중요한건 마찬가지로 스레드 이므로 UI스레드가 어떤 일을 하고 있는지 상관없이



별개의 일을 진행한다는 점이다. 따라서 AysncTask는 비동기적으로 작동한다.





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



세번째 메서드는 doInBackground 메서드에서 중간중간에 UI스레드 에게 일처리를 맡겨야 하는 상황일때



쓴다. 매개변수로 Void를 받으므로, doInBackground안에 실제인자가 없이,



 publishProgress( ) 메서드를 호출하면 BackgroundThread 중간에 mainThread에게 일을 시킬 수 있다.





@Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }



마지막 메서드다. background Thread가 일을 끝마치고 리턴값으로 result를 넘겨준다.



그 값을 지금 보고 있는 해당 메서드가 매개변수로 받은후 받은 데이터를 토데로



UI스레드에 일처리를 시킬때 쓰는 메서드이다.



보통 UI변경 ( ex) textview.setText("~~") )할때 많이 사용된다. 왜냐면



위에서도 말했다시피 UI변경은 메인스레드가 아닌 다른 스레드에서의 변경은 막았기 때문이다.



위에서 만든 AysncTask를 사용 하는방법은 아래와 같이 하면된다.



MommooAsyncTask asyncTask = new MommooAsyncTask();
asyncTask.execute();


출처: https://mommoo.tistory.com/29 [개발자로 홀로 서기]

 

출처 : gangnam-americano.tistory.com/47 

현재 ArrayList를 보면 <>안에 String, List에는 <>안에 int형을 나타내는 Integer가 들어가 있다.



이 <>를 제네릭(Generics)이라 하는데, 이 <>안에 어떠한 타입을 선언해주어 해당 ArrayList, List 등이 사용할 객체의 타입을 지정해준다는 뜻이다. 이는 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 하며, 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해주는 효과가 있습니다. 

import java.util.ArrayList;
import java.util.List;
 
public class Generics {
 
    public static void main(String[] args) {
        
        ArrayList<String> arrList = new ArrayList<String>();
        
        arrList.add("박지성");
        arrList.add("손흥민");
        arrList.add("기성용");
        
        for(int i=0; i<arrList.size(); i++){
            System.out.println("arrList : " + arrList.get(i));
        }
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(123);
        list.add(456);
        list.add(789);
        
        for(int i=0; i<list.size(); i++){
            System.out.println("list : " + list.get(i));
        }
    }
 
}
Colored by Color Scripter
cs

위의 예시를 보면,



ArrayList는 String으로 선언해주어, ArrayList는 String 객체만 다루게 되며,

List는 Integer로 선언해주어, List는 int형 객체만 다루게 됩니다.

출처: https://gangnam-americano.tistory.com/47

 

 

728x90

+ Recent posts