2013-01-03 3 views
3

WebView에서 SQLite db에 캐시 된 일부 원격 데이터를 보여주는 응용 프로그램을 작성하고 있습니다. 데이터는 JavaScript 인터페이스를 통해 WebView의 JavaScript 함수에 의해 요청됩니다.안드로이드 응용 프로그램이 예외없이 종료됩니다.

사용자가 페이지의 입력 요소에 입력 할 때 자바 스크립트 함수는 자바 함수를 호출하여 검색 결과를 요청하고 SQL 함수를 호출합니다. 그런 다음 결과가 적합한 JSON 형식으로 패키징되어 반환됩니다.

매우 빠르게 입력하지 않으면 데이터를 가져 오는 것이 좋습니다. 몇 키를 누른 후 앱을 빨리 입력하면 없이이 던져지는 예외가 발생하며 홈 화면으로 돌아갑니다.

나는 원인을 좁히기 위해 관리해 왔습니다. .query 메소드에 대한 호출을 주석 처리하면 충돌을 방지 할 수 있지만 앱은 쓸모 없게됩니다.

어떤 응용 프로그램이 종료되었는지 확인하는 방법이 있습니까? 다른 로그 또는 도움이 될만한 도구가 있습니까?

자바 기능 코드 :

public Lot[] getLotList(String query, int limitCount) { 
    ... 
    ... 
    String[] resultColumns = new String[] { LotsSearch._ID }; 
    String queryWhere = LotsSearch.TABLE_NAME + " MATCH ?"; 
    String[] queryArgs = new String[] { query + "*" }; 
    String sortOrder = LotsSearch.COLUMN_NAME_NUMBER + " ASC, " + LotsSearch.COLUMN_NAME_TITLE + " ASC"; 
    String limit = null; 
    Cursor cursor = null; 
    if (limitCount != -1) 
     limit = "0," + limitCount; 
    try { 
     cursor = mDb.query(LotsSearch.TABLE_NAME, resultColumns, queryWhere, queryArgs, null, null, sortOrder, limit); 
     if (cursor != null && cursor.moveToFirst()) { 
      result = new Lot[cursor.getCount()]; 
      try { 
       int idColumnIndex = cursor.getColumnIndexOrThrow(LotsSearch._ID); 
       int lotId; 
       Lot lot; 
       do { 
        lotId = cursor.getInt(idColumnIndex); 
        lot = mLots.get(lotId); 
        if (lot != null) 
         result[index++] = lot; 
       } while (cursor.moveToNext()); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (SQLiteException e) { 
     e.printStackTrace(); 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    ... 
    ... 
    return result; 
} 

UPDATE :

내가

logcat -b events 

응용 프로그램 충돌을 실행하여 액세스 할 수있는 다른 로그가 있음을 발견했다 단지 하나의 항목이 있습니다

I/am_proc_died( 59): [11473,com.example.app] 

앱 종료가이 로그 항목의 설정을 보여줍니다 gracefuly 때

I/am_finish_activity( 59): [1157978656,22,com.example.app/.MainActivity,app-request] 
I/am_pause_activity( 59): [1157978656,com.example.app/.MainActivity] 
I/am_on_paused_called(11473): com.example.app.MainActivity 
I/am_destroy_activity( 59): [1157978656,22,com.example.app/.MainActivity] 
+0

로그 게시 –

+0

게시 할 항목이 없으며 logcat이 완전히 비어 있습니다 (충돌 할 때마다 단일 항목이 추가되지 않음). 그래서 다른 디버깅 제안 사항이 있는지 묻습니다. – Swav

+0

브레이크 포인트를 적용하여 디버깅을 시도 했습니까? 단지 바보 같은 질문 이군요. –

답변

1

나는 내 자동 검색 기능을 변경 한 것입니다. 즉, 사용자가 약 1/2 초 동안 키를 누르지 않은 경우에만 검색을 수행하십시오.

빨리 입력하는 경우 결과가 다시 돌아 오기 전에이 기능이 여러 번 실행됩니다. 그 사이에 커서 리소스가 너무 많아 한 번에 앱이 완전히 실패 할 수 있습니다.


갱신. 당신이 그것을 고려한다면 10 개의 키를 꽤 빨리 연속적으로 타이핑하면 10 개의 서로 다른 쿼리가 실행되고 파싱되는 결과를 가져올 수 있습니다 ... 다중 스레드를 회전 시키면 실제로 getLotList 메서드를 호출하는 코드에 몇 가지 교착 상태가 발생할 수 있습니다 UI를 시도하고 업데이트하려고합니다. 이것은 유령을 포기하거나 문제를보고 할 스레드를 알지 못하는 일부 프로그램으로 이어질 수 있습니다.

물론, 그 모든 것들은 우리가 가지고있는 작은 스 니펫에서 이야기하기가 어렵습니다.

+0

고마워,이 좋은 해결 방법입니다,하지만 나에게 걱정하는 것은 응용 프로그램이 logcat에 어떤 흔적도없이 실패하기 때문에 전체적인 디자인에 문제가있을 수 있으며 어떤 것을 발견 할 수 있을지 생각할 수 없습니다. 잘못된 것입니다. BTW. 나는 그것을 빨리 입력하지 않았습니다. 약 10 건의 키 입력만으로도 끝내기에 충분했으며 그 시점에서 해고 된 쿼리 만이 해당 함수에서 나온 것입니다. – Swav

+0

코드의 나머지 부분은 자바 인터페이스에서 함수를 호출하는 JavaScript 함수가 매우 간단합니다. 차례로 질문에 나열된 함수를 호출합니다. 모든 JavaScript 함수는 결과에서 JSON.parse를 호출하며 인터페이스 함수는 함수의 결과를 질문에 패키징합니다. – Swav

관련 문제