2025년 9월 23일 카카오 사태가 벌어졌다. 나는 다행히 앱스토어 설정에 들어가서 자동업데이트를 비활성해서 이번 사태를 잠깐 피해갈 수 있었다. 하지만 유튜브를 보다보니까 이번에 업데이트를 이미 한 사람들에게 나의 프로필이 까발려 진다는 것을 알게되었다. 내 친구한테 알려지는 건 좋은데 카카오톡은 내가 전혀 모르는 사람이나 싫은 사람, 업무적인 사람들 연락처에 있는 모든 사람이나 전화 번호가 변경되서 모르는 사람들도 친구 목록에 표시가 된다. 그런 모든 사람들에게 내 사생활을 강제로 공개되도록 해버렸다는 거에 공포를 느꼈다. 프로필 탭으로 이동해서 내 프로필에서 오른쪽 상단에 설정 버튼이 있고 그걸 클릭하면 프로필 설정들이 있고 거기서 옵션들을 비활성 해주자 “프로필 인증배지 표시”, “내 프로필 검색”, “내 홈 표시” 모두 비활성 해줬다. 솔직히 앞으로 이번 사태 이전으로 롤백을 시키지 않는한 앞으로 프로필에 사진을 올릴거 같지 않다. 이미 앱은 배포가 되었고 이 사태가 벌어진 버전의 앱을 업데이트 하지 않고 사용하는 사람들이 많을것이다. (보통은 앱을 배포 하고 강제로 업데이트 유도하지 않는 이상 앱을 업데이트 하지 않는 사람들이 많다.) 만약에 더 프로필 공개에 공포를 느낀다면 프로필에 올린 이미지들을 당장 지우자. *추가* 숏폼과 오픈채팅을 합쳐놓은 것도 참 거지같은 짓을 한거라고 생각한다. 오픈채팅에 개발이나 다이어트나 여러가지 같은 관심을 가진 사람들이 단체 톡방에 들어가서 커뮤니티를 하고 계실거다. 나도 개발 단체톡방에 들어가서 대화를 하는데 왜 그걸 합쳐놔서 오픈채팅을 들어가기 위해서 무조건 숏폼을 강제로 봐야 한다는 건 참 별로다. *추가 2* 벌서 온갖 야시시 하고 폭력적인 숏폼에 노출되고 있...
iOS 로 먼저 작업을 하고
안드로이드에서 작업을 하면서 iOS의 dispatch Queue 블록 코딩처럼
코드에서 바로 AsyncTask 로 백그라운드 코딩을 넣고 작업이 끝나면 mainThread 에서 나머지 ui thread 작업을 하도록 할 수 없을까 고민하다가 만든 소스
프로젝트에 GlobalThread Class 파일을 만들어서 구성을하고
아래의 사용방식으로 소스에서 바로 불러서 구성
-- GlobalThread 사용 --
GlobalThread globalThread = new GlobalThread(this, false, new Handler() { //final EchoCallBack cback = callback; public void handleMessage(Message msg) { // 각 화면에 갱신 (데이터 가져오기) 요청을 보낸다 //stopIndicatorDialog();
-- 메인쓰레드에서 하는 동작을 여기서 처리 --
} }){ @Override protected Object doInBackground(Object... params) { gLog("doInBackground 2"); -- 백그라운드 동작은 여기서 처리 --
-- 파라메터를 받아서 처리 가능 -- return super.doInBackground(params); } }; globalThread.execute(-- 여기에 복수의 데이터를 전달하면 doInBackground 에서 데이터를 받음 --);
-- GlobalThread class --
public class GlobalThread extends AsyncTask<Object, Integer, Object> {
public Context gContext = null;
public Handler handler = null;
boolean showDialog = false; // 다이얼로그 표시 여부 MyProgressDialog pdialog = null;
public GlobalThread(Context context, boolean showdialog, Handler handler) {
this.handler = handler;
gContext = context;
showDialog = showdialog;
}
public void gLog(String logMessage){
DebugLog.debug(gContext, "GlobalThread : "+logMessage);
}
private void dismissDialog(){
if(showDialog == true && pdialog != null){
pdialog.dismiss();
new WeakReference<Object>(pdialog);
pdialog = null;
}
}
private void showDialog(){
dismissDialog();
if(gContext != null && showDialog == true){
if(pdialog == null){
pdialog = MyProgressDialog.show(gContext, "", "", true, false, null);;
}
}
}
/** * AsyncTask * @param params * @return */ @Override protected Object doInBackground(Object... params) {
// 백그라운드에서 실제 해야하는 것을 이곳에 DebugLog.debug(gContext, "GlobalThread (doInBackground)");
if(params != null && params.length > 0){
return params[0];
}
return null;
}
/** * AsyncTask */ @Override protected void onCancelled() {
super.onCancelled();
}
/** * AsyncTask * @param result */ @Override protected void onPostExecute(Object result) {
// 백그라운드(doInBackground)에서 진행이 되고 실행됨 // 리턴된 갓이 파라메터로 전달
dismissDialog();
DebugLog.debug(gContext, "GlobalThread (onPostExecute)");
Message msg = this.handler.obtainMessage();
msg.obj = result;
msg.what = 0;
this.handler.sendMessage(msg);
super.onPostExecute(result);
}
/** * AsyncTask */ @Override protected void onPreExecute() {
// TODO Auto-generated method stub DebugLog.debug(gContext, "GlobalThread (onPreExecute)");
showDialog();
super.onPreExecute();
}
/** * AsyncTask * @param values */ @Override protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub DebugLog.debug(gContext, "GlobalThread (onProgressUpdate)");
super.onProgressUpdate(values);
}
}