화면 호출 시, 서버 연동을 하는 부분에 있어서 로딩이 엄청 걸리는 부분이 발생
화면을 먼저 호출하고, 연동 부분을 쓰레드로 처리해서 로딩바로 처리할 필요성이 생김.
통상적으로 서버 호출 해서 jsonData 가지고 오고, RecyclerView에 DataBinding하는 부분에 시간을 잡아먹음
그래서, 그 부분을 Thread를 이용해서 처리함
Handler 멤버변수 설정
private Handler mainUIHandler;
private Handler bgThreadHandler;
Handler 정의
mainUIHandler 에서 최종 mRecyclerView.setAdapter 처리함
mainUIHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setVisibility(View.VISIBLE);
mPbLoading.setVisibility(View.GONE);
//setWordCategoryList();
}
};
new BackgroundThread().start();
BackgroundThread Class 생성
class BackgroundThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
this.setName(BackgroundThread.class.getName());
this.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
// Looper must be prepared before creating handler for background
// thread
Looper.prepare();
initDataSet(); //서버 호출 및 JsonParser 등 처리
bgThreadHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if (mainUIHandler != null) {
Message message = mainUIHandler.obtainMessage();
mainUIHandler.sendMessage(message);
}
}
};
// Run the message queue in this thread call Looper.loop()
Looper.loop();
}
}
서버 호출 및 json 처리 진행
서버 호출이 정상적으로 처리 되었으면, 해당 Adapter 및 RecyclerView 처리
private void initDataSet(){
String url = mContext.getString(R.string.request_mybook_list_url);
String paramName = "mbIdx";
String paramValue = mSession.getUserIdx();
RequestBasicOneParamTask requestBasicOneParamTask = new RequestBasicOneParamTask();
AsyncTask<String, Void, JSONObject> jsonObject = requestBasicOneParamTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url, paramName, paramValue);
try {
JsonParserFactory jpFactory = new JsonParserFactory();
IJsonParser<?> jsonParser = jpFactory.create("common", "My_book_list");
jsonParser.parserJson(jsonObject.get());
CommonBean commonData = (CommonBean) jsonParser.getData();
if (StringUtil.intToString(AppConstant.REQUEST_SUCCESS).equalsIgnoreCase(commonData.getRes_result())) //정상 전문
{
BookListJsonParser bookListJsonParser = new BookListJsonParser();
mBookList = bookListJsonParser.parse(commonData.getRes_array());
setWordCategoryList();
}
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
}
RecyclerView 및 Adapter 세팅
여기에서 MainUiHandler를 호출해서 처리함
private void setWordCategoryList() {
mAdapter = new MyBookListAdapter(mContext, mBookList);
((MyBookListAdapter) mAdapter).setOnItemClickListener(mBookListClickListener);
new Thread()
{
public void run()
{
if (mainUIHandler != null) {
Message msg = mainUIHandler.obtainMessage();
mainUIHandler.sendMessage(msg);
}
}
}.start();
}
종종 써먹어야겠다 ^^
다들 즐거운 코딩하세요
'Android Coding' 카테고리의 다른 글
JNI GetMethodID 관련 타입 정리 (0) | 2019.02.18 |
---|---|
RecyclerView에서 StaggeredGridLayoutManager 적용 후 SwipeRefreshLayout 의 Refresh 할 때 (0) | 2019.02.13 |
선택 시, Ripple 효과 (0) | 2018.10.19 |
여러 장의 jpg를 PDF로 만들기 (0) | 2018.09.06 |
Android Acitivty restart (0) | 2018.08.03 |