Android Coding

Thread를 이용한 RecyclerView UI 변경 처리

오마로 2018. 12. 13. 12:20
반응형


화면 호출 시, 서버 연동을 하는 부분에 있어서 로딩이 엄청 걸리는 부분이 발생

화면을 먼저 호출하고, 연동 부분을 쓰레드로 처리해서 로딩바로 처리할 필요성이 생김.


통상적으로 서버 호출 해서 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();
}


종종 써먹어야겠다 ^^

다들 즐거운 코딩하세요 


반응형