">

AsyncTask 쉬운 따라하기



public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;
TextView textView;
Button button;
Async async;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
textView = (TextView)findViewById(R.id.textView_result);
button = (Button)findViewById(R.id.btn_stop);


async = new Async();
async.execute(0, 100);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
async.cancel(false);
}
});
}


// 첫 번째 인자는 doInBackground, 두 번째는 onProgressUpdate,
// 세 번째는 onPostExecute와 onCancelled에 사용됨
private class Async extends AsyncTask<Integer, Integer, Integer>{
@Override
protected Integer doInBackground(Integer... params) {
int i = params[0];
int j = params[1];

while(i < 100 && !isCancelled()) { // isCancelled는 중간에 cancel 했는지 확인하기 위해 사용
Log.d("Test", String.valueOf(i));
publishProgress(i, j);
i++;
j--;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return i;
}

// 가장 먼저 실행 됨
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d("Test", "============== Pre Execute =============");
}

// doInBackground에서 작업이 모두 마치면 실행 됨
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);

textView.setText(String.valueOf(integer));
}

// doInBackground에서 호출하면 실행 됨
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.d("Test", "============== onProgressUpdate ==============");
Log.d("Test", "Progress: " + String.valueOf(values[0]) + " " + String.valueOf(values[1]));
progressBar.setProgress(values[0]);
textView.setText(String.valueOf(values[0]));
}

// cancel 호출하면 실행 됨
@Override
protected void onCancelled(Integer integer) {
super.onCancelled(integer);
Log.d("Test", "============== onCancelled value: " + integer + "============");
}

// cancel 호출하면 실행 됨
@Override
protected void onCancelled() {
super.onCancelled();
Log.d("Test", "============== onCancelled ==================");
}
}
}


주석만 대충 읽어봐도 흐름은 눈에 보일 것이다. onProgressUpdate와 onPostExecute에서 UI 작업을 하면 된다. 

차이점은 onProgressUpdate에서는 스레드가 동작하는 동안 계속 UI를 변경 시킬 수 있고, onPostExecute는 

스레드가 종료된 이후 UI를 변경한다는 점이다. 


doInBackground 메서드 안의 while문에서 isCancelled 메서드를 통해 스레드가 cancel 됐는지를 계속 확인한다.

AsyncTask를 즉각 멈추기 위해서 사용하는 것이다. 

이런 확인 과정이 없으면 AsyncTask를 중간에 종료해도 while문은 조건이 틀릴때 까지 계속 동작한다. 



'프로그래밍 > Android' 카테고리의 다른 글

Viewpager 쉽게 만들어 보자  (0) 2017.05.25
탭(Tab) 쉽게 만들어 보자  (2) 2017.05.19
Retrofit 단순 예제  (0) 2017.05.11
Preference  (0) 2017.05.08
리스트뷰 아이템 내용 가져오기  (0) 2017.03.21

Retrofit


1. 인터넷을 사용하기 때문에 manifests에 퍼미션을 등록 합니다. 

<uses-permission android:name="android.permission.INTERNET"/>


2. gradle에 retrofit를 추가한다. 이후 gson도 사용할 예정이라 미리 추가 했습니다. 

compile 'com.google.code.gson:gson:2.7'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'


3. Interface를 하나 생성한다. 예제로는 ApiService.class 파일에 만들도록 하겠습니다. 

아래 Url은 json 형태의 데이터를 서버로부터 미리 받을 수 있도록 만들어 놓은 사이트 입니다.  

public interface ApiService {
public static final String API_URL = "http://jsonplaceholder.typicode.com/";

@GET("comments")
Call<ResponseBody>getComment(@Query("postId") int postId);

}

@GET는 GET 방식을 의미하며 뒤의 "comments"는 URL 이후 주소를 의미 합니다. 

@Query("postId")는 url에서 ?postId= 를 의미하고, int postId는 파라미터 값을 의미 합니다. 

즉, http://jsonplaceholder.typicode.com/comments?postId=1 과 같은 url이 만들어 집니다.


4. MainActivity에서 retrofit을 호출해 보도록 하겠습니다.

public class MainActivity extends AppCompatActivity {
Retrofit retrofit;
ApiService apiService;
Call<ResponseBody> comment;

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

retrofit = new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
apiService = retrofit.create(ApiService.class);

comment = apiService.getComment(1);
comment.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
Log.d("Test", response.body().string());
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {

}
});
}
}


실행하면 로그로 json 형태의 데이터를 가져오는 것을 확인할 수 있습다. 

이후 gson을 통해 데이터를 간편하게 파싱하는 것을 진행하도록 하겠습니다. 

'프로그래밍 > Android' 카테고리의 다른 글

탭(Tab) 쉽게 만들어 보자  (2) 2017.05.19
AsyncTask 쉬운 따라하기  (0) 2017.05.15
Preference  (0) 2017.05.08
리스트뷰 아이템 내용 가져오기  (0) 2017.03.21
리스트뷰의 마지막 확인하기  (0) 2017.03.21

Preference


정의하기: 

SharedPreferences pref;


저장할 공간 만들기: 

pref = getSharedPreferences("setting", 0);


여기서 0은 읽기, 쓰기 가능이며 MODE_WORLD_READABLE은 읽기 공유

MODE_WORLD_WRITEABLE는 쓰기 공유입니다. 

또한 fragment에서 preference 저장할 공간을 만드려면 아래와 같이 해야 합니다.

pref = this.getActivity().getSharedPreferences("setting", 0); 


저장된 값을 가져 오는 방법은 다음과 같습니다. (문자열일 때)

String preStatement = pref.getString("setting", "basic");

어디서 값을 가져올지(setting)와 저장된 값이 없다면 기본 값(basic)을 가져오도록 합니다. 


값을 넣는 방법은 아래와 같습니다. 

SharedPreference.Editor editor = pref.edit();

editor.putString("setting", "saved");

editor.commit();


반드시 commit를 해야합니다. 



앱이 커지면 preference로 사용하는 개수가 많아지고 관리가 잘 되지 않습니다. 

그래서 class 파일을 하나 더 만들어서 별도로 관리하는 것이 좋습니다. 

class 파일을 하나 더 만든 다음

public static final String PREF_SETTING = "PREF_SETTING";

으로 가져온 다음 key 값에 클래스.PREF_SETTING로 사용하면 됩니다. 


'프로그래밍 > Android' 카테고리의 다른 글

AsyncTask 쉬운 따라하기  (0) 2017.05.15
Retrofit 단순 예제  (0) 2017.05.11
리스트뷰 아이템 내용 가져오기  (0) 2017.03.21
리스트뷰의 마지막 확인하기  (0) 2017.03.21
CheckBox 이미지 변경하기  (0) 2017.03.21

+ Recent posts