액티비티에 붙여져 있는 View 를 구하는 방법 3가지에 대해


소개하고자 한다.






1. View 객체에 미리 담는 방법.


View view = getLayoutInflator.from(this).inflate(R.layout.main_activity,null);

setContentView(view);


윗 방법은 View 객체에 미리 view의 정보를 담은 후,


참조하고 싶을때 view라는 변수를 통해서 참조 하면 된다.



2. findViewById를 이용하여 View 객체에 담는 방법.


setContentView(R.layout.main_activity,null);

View view = findViewById(R.id.rootView);


윗 방법은 main_activity.xml 안에 최상위 부모뷰에


id를 rootView로 선언 한 뒤, 사용하면 된다.


위와 똑같이 view로 넣었지만 혹, ViewGrop으로 사용하고 싶을시,


다운캐스팅을 해준다. 아래의 예제를 보자.



ex) 뷰그룹으로 받고 싶을시,


ViewGroup viewGroup = (ViewGroup)findViewById(R.id.rootView);


ex) 부모뷰가 특정 ViewGroup일시 - FrameLayout


FrameLayout frameLayout = (FrameLayout)findViewById(R.id.rootView);



3. Activity의 context 정보로 구하는 방법


View view = context.getWindow().getDecorView() ;



윗 방법은 Activity의 context로 액티비티에 붙여져 있는 view를 구하는 방법이다.


이것 역시 ViewGroup 또는 특정 ViewGroup으로 받고 싶을때는 다운캐스팅 해준다.


아래의 예제를 보자.



ex) 뷰그룹으로 받고 싶을시,


ViewGroup viewGroup = ((ViewGroup)context.getWindow().getDecorView()) ;


ex) 부모뷰가 특정 ViewGroup일시 - FrameLayout


FrameLayout frameLayout = ((FrameLayout)context.getWindow().getDecorView()) ;



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

안드로이드는 기존에 자바에서 제공하는 Thread 뿐만아니라


AsyncTask라는 스레드 객체를 제공한다.


안드로이드가 AsyncTask 라는 객체를 왜 만들어 제공할까?


아래의 글은 Android Developer 에서 발췌한 일부 글이다.


AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as ExecutorThreadPoolExecutor and FutureTask.

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread.



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


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


백그라운드 스레드와 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객체는 abstract로 작성되었다. 따라서, 익명클래스로 사용허던가 위와 같이 상속을 통해서 사용해야 한다.


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


제네릭 인자3개를 정해야한다. 


첫번째 인자는 doInBackground 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.


두번째 인자는 onProgressUpdate 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.


세번째 인자는 onPostExecute 메서드에 선언하는 매개변수의 타입을 정한다.


@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();


execute의 아규먼트는 doInBackground에서 받는 String... 가변인수이다. 필요시 넣으면 되겠다.



해당 URL은 저번에 작성한 포스팅인데 AsyncTask를 사용하였다. 예시로 보면 될 것이다.


http://mommoo.tistory.com/5



여기까지가 준비한 AysncTask의 내용이다.


직접 Thread와 Handler 를 구현해보고 작성해봤다면,


안드로이드가 제공해주는 AysncTask가 얼마나 편리한지 알 수 있을 것이다.



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

소켓프로그래밍을 하거나 파일입출력을 할때


자바가 제공하는 스트림을 사용한다.


(InputStream , OutputStream)


하지만 Byre 단위라서 영어나 숫자등은 잘 출력되는데,


단위가 2바이트인 한글은 깨져서 출력된다.


그래서 char 단위인 InputStreamReader를 쓴다.


해당 클래스를 쓰면 한글도 잘 출력되지만, 한글자씩 받아와야 하는


상황이 아니면 버퍼에 저장하여 한꺼번에 받는 방식을 많이 사용한다.


아래와 같이 코딩한다.


InputStream is = // inputStream 초기화는 상황마다 틀리므로, 초기화됬다 가정한다.


String temp;


BufferedReader buffer = new BufferReader(new InputStreamReader(is,"UTF-8");


while((temp = buffer.readLine() ) != null){


//........


}



윗 코딩 처럼 사용할때, 주의 할점이 readLine()은 개행문자가 포함되어야 내부 blocking이 풀리면서 wihle문이 실행한다는 것이다.


다시 말하자면,


BufferReader의 readLine() 를 쓸때는 inputStream 이 반드시 개행문자가 포함되어야 한다. 자바에서의 개행문자는 "\n" 이지만,


스트림에서의 개행문자는 "\r\n"이 개행문자이다. 


따라서, 보내는쪽의 데이터 뒤에 "\r\n"을 반드시 붙여야한다.


ex ) 


String tempData = "아야어여오유";


Byte[] bytes = (tempData+"\r\n").getBytes();




'Java' 카테고리의 다른 글

JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25
Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

이클립스 폰트 설정하는 방법이다.





이클립스 윗 메뉴를 보면 아래와 같이 구성되어 있다.





아래와 같이 window 탭으로 이동한다.





Preferences탭을 누르면 아래와 같이 프레임이 나타난다.






General 탭에서 Colors nad Fonts 를 클릭한 후 오른쪽 메뉴에서 Basic 폴더 안에 맨아래의 Text Font 메뉴를 클릭한다.


후에 Edit 버튼을 누른다. 아래와 같은 프레임이 나타날 것이다.  마음에 드는 폰트종류나 폰트 크기를 설정해주면 되겠다.









'IDE' 카테고리의 다른 글

[IntelliJ] IDEA DB Client 사용하기  (0) 2019.11.07
[IntelliJ] 인텔리J에 이클립스 Tab 기능 설정하기.  (2) 2018.12.23

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts