마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

service 돌릴때 다른작업

0 추천
 list.setOnItemLongClickListener(new OnItemLongClickListener() {

      @Override
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
        int arg2, long arg3) {

       Cursor c = (Cursor)list.getItemAtPosition(arg2);
       idIndex1=c.getString(SUMMARY_ID_COLUMN_INDEX);
       
       final CharSequence[] items = {"Delete"};
       AlertDialog.Builder item = new AlertDialog.Builder(mContext,AlertDialog.THEME_HOLO_LIGHT).setTitle(c.getString(1));
       item.setItems(items, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int item) {
            switch (item) {
            case 0: { 
         doDeleteContact(idIndex1);
         adapter.swapCursor(tmpCursor(idIndex1));
           return; 
          }
            }
           }
       }).create();
       mPopupDlg=item.show();
       
       return false;
      }
        });

protected void doDeleteContact(String id) {
   mContext.startService(ContactSaveService.createDeleteContactIntent(this.mContext, id));
}

디비데이터를 지우는것을 서비스로 돌렸는데

디비데이터가 지워질때까지 다른작업을 할수없습니다.

 

서비스는 백그라운드에서 도는거니까

작업여부에 상관없이 다른작업을 할수있어야 할것같은데

(예를들면 스크롤 이나 activity 이동 )

 

먼가 잘못쓴것인지...

ㅠㅠㅠㅠㅠㅠㅠ

 

now882002 (3,860 포인트) 님이 2015년 3월 4일 질문

3개의 답변

+1 추천
궁금해서 검색해봤는데 SQLite 트랜잭션이 다른 디비 관련 액티비티를 block 한다는 말이 있군요

delete 할 때 다른 액티비티에서 디비 관련 작업을 하는지 확인해보세요
mamondebaltob (32,750 포인트) 님이 2015년 3월 4일 답변
Write Ahead Logging 모드로 하면 writing/updating 하는 중에도
reading 을 lock 이슈 없이 할 수 있답니다.
단 여기서도 writing/updating 은 1 connection 만 가능
Write Ahead Logging 모드로 한다는게 무슨말인지;; ㅠ
너무 어렵네요
0 추천
왜 서비스로 돌리시나요..

비동기(asynctask)로 처리하시면 간단할거 같은데..
이드로이드 (22,930 포인트) 님이 2015년 3월 4일 답변
asynctask 로 돌려도 서비스 돌린거하고 동일하게
작업이 완료된이후에 다른작업가능해요 ㅠ
Asynctask의 doInBackground 에서 백그라운드 작업을 처리하면
onPostExecute가 호출 되는데 여기서 작업후 메인 쓰레드에서 처리할 작업을 작성하시면 됩니다.(백그라운드 작업후 처리할 작업이 없다면 무시하셔도 됩니다.)
백그라운드 작업을 위해 서비스를 사용하는 경우는 거의 없습니다..


new AsyncTask() {
        @Override
        protected String doInBackground(Void... params) {
            //DB 작업
        }
        @Override
        protected void onPostExecute(String msg) {
            
        }
    }.execute


아래 링크 참고하세요.
http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-AsyncTask-%EC%82%AC%EC%9A%A9%EB%B2%95
asyncTask 가 종료되어야지만 다른 작업이 가능함...
0 추천
DB 작업을 어디에서 하시는지 모르겠으나 Service의 라이프사이클 메소드 (onCreate 등)은 모두 메인스레드에서 실행됩니다.

별도 스레드에서 작업을 돌리려면 직접 그렇게 동작하도록 코드를 만들어야 합니다.

다른분 말씀처럼 AsyncTask 만으로도 잘 되어야 합니다. 뭔가 코드를 잘못 만든 것 같아요.
익명사용자 님이 2015년 3월 4일 답변
...