2012-05-13 3 views
0

내 응용 프로그램은 텍스트 파일 자산에서 많은 양의 데이터를 읽고 TextView에 화면에 표시합니다. (가장 큰 것은 ~ 450k입니다.) 파일을 SpannableStringBuffer으로 읽어들입니다 (섹션 이름과 같이 제거한 일부 메타 데이터가 있기 때문에). 이 접근 방식은 지난 2 년 동안 시장에 앱을 설치했는데 (7k 이상의 활성 장치 설치) 불만없이 효과적이었습니다. 따라서 코드가 합리적으로 정확하다는 것을 알고 있습니다.SpannableStringBuffer는 9,999 자로 제한됩니까?

그러나 텍스트가 잘린 LG Lucid (LGE VS840 4G, Android 2.3.6)의 사용자로부터 최근 보고서를 받았습니다. 로그 항목에서 내 응용 프로그램은 버퍼에 9,999 자 밖에 없습니다. 이 문제는 SpannableStringBuffer과 관련하여 알려진 문제입니까? 큰 Spannable 버퍼를 만드는 다른 권장 방법이 있습니까? 제안 된 해결 방법은 무엇입니까?

SpannableStringBuilder에 추가 할 때마다 업데이트되는 별도의 예상 길이를 유지하는 것 외에 추가 인터페이스가 개체가 아니라 오류를 반환하기 때문에 오류를 감지하는 좋은 방법이 없습니다. 데이터의 읽고

내 코드는 다음과 같습니다

currentOffset = 0; 
    try { 
     InputStream is = getAssets().open(filename); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     ssb.clear(); 
     jumpOffsets.clear(); 
     ArrayList<String> sectionNamesList = new ArrayList<String>(); 
     sectionOffsets.clear(); 
     int offset = 0; 
     while (br.ready()) { 
      String s = br.readLine(); 
      if (s.length() == 0) { 
       ssb.append("\n"); 
       ++offset; 
      } else if (s.charAt(0) == '\013') { 
       jumpOffsets.add(offset); 
       String name = s.substring(1); 
       if (name.length() > 0) { 
        sectionNamesList.add(name); 
        sectionOffsets.add(offset); 
        if (showSectionNames) { 
         ssb.append(name); 
         ssb.append("\n"); 
         offset += name.length() + 1; 
        } 
       } 
      } else { 
       if (!showNikud) { 
        // Remove nikud based on Unicode character ranges 
        // Does not replace combined characters (\ufb20-\ufb4f) 
        // See 
        // http://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet 
        s = s. replaceAll("[\u05b0-\u05c7]", ""); 
       } 
       if (!showMeteg) { 
        // Remove meteg based on Unicode character ranges 
        // Does not replace combined characters (\ufb20-\ufb4f) 
        // See 
        // http://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet 
        s = s.replaceAll("\u05bd", ""); 
       } 
       ssb.append(s); 
       ssb.append("\n"); 
       offset += s.length() + 1; 
      } 
     } 

     sectionNames = sectionNamesList.toArray(new String[0]); 

     currentFilename = filename; 

     Log.v(TAG, "ssb.length()=" + ssb.length() + 
       ", daavenText.getText().length()=" + 
       daavenText.getText().length() + 
       ", showNikud=" + showNikud + 
       ", showMeteg=" + showMeteg + 
       ", showSectionNames=" + showSectionNames + 
       ", currentFilename=" + currentFilename 
       ); 

인터페이스 찾고 후, 나는 InputFilter들과 함께 showNikud 및 showMeteg 케이스를 교체 할 계획입니다.

답변

0

이 문제는 SpannableStringBuffer와 관련하여 알려진 문제입니까?

SpannableStringBuffer의 크기에 대한 하드 제한을 제안하는 내용은 소스 코드에서 볼 수 없습니다. 내 경험에 비추어 볼 때, 디바이스 제조업체의 엔지니어가 멍청한 결정을 내린 결과로,이 문제는 해당 디바이스에 특유한 문제라고 생각합니다.

권장되는 해결 방법은 무엇입니까?

Google Play 스토어를 통해 배포하는 경우 콘솔에서이 기기를 차단하십시오.

또는 하나의 거대한 TextView를 사용하지만, 대신에, (그들은 재활용 할 수 있도록)를 ListView에서 단락 당 아마도 하나를 여러 개의 작은 TextView 위젯을 사용하지 마십시오. 이렇게하면 메모리 사용 공간을 줄이는 이점이 있습니다.

또는 HTML을 생성하고 내용을 WebView에 표시하십시오.

+0

'ListView'에서 ('ScrollView'에서)'TextView'를 엄청 많이 만들면 화면에서 스크롤 된'TextView's가 자동으로 recyled됩니까? 'WebView'는 불행히도 옵션이 아니지만 음성 화 된 히브리어 텍스트를 표시하고 안드로이드는 역방향으로 표시합니다 (버그는 ICS에서만 수정 됨). – shmuelp

+0

@shmuelp : "자동으로 recyled 되나요?" - 잘 쓰여진 '어댑터'로 예. – CommonsWare

0

테스트 앱을 작성하고 (사용자가 실행 한 후) 기기가 SpannableStringBuilder에 대한 임의의 제한을 가지고 있지만 StringBuilder 또는 StringBuffer이 아닌 것으로 보입니다. 빠른 변경을 테스트하여 StringBuilder으로 읽은 다음 결과에서 SpannableString을 만듭니다. 불행하게도, 그것은 완전히 읽을 때까지 나는 스팬을 만들 수 없습니다.

내가 그 내 응용 프로그램의 긴 더 나은 작동하는지 확인하기 위해 ListView에서 여러에게 TextView 객체를 사용뿐만 아니라 Html.FromHtml 사용을 고려해야 장기 계획.

관련 문제