新Android版本中字符串处理速度很慢(4.3)

时间:2013-12-29 21:17:00

标签: android

我正在尝试将String分成多个页面。该字符串包含一个故事(因此有点长),我需要将其加载到字符串的ArrayList中,它将显示为各种页面。

下面是我的代码中的方法,它接受长字符串并将其分解为页面并加载字符串的ArrayList。我的问题是这在Android 3.2中运行得相当快。但是在我的另一部4.3的手机中,它的加载非常慢(比如3.2秒内的2秒内工作需要大约10秒)。以下是我的代码。你们中的任何人都可以在代码中建议任何改进,这可以使它在新版本中更快地运行。不确定为什么新版本的处理速度比旧版本慢。

TextView contentTextView = (TextView)findViewById(R.id.textViewStory1);
String contentString;
TextPaint tp = contentTextView.getPaint();
String[] pages;
int totalPages=0;
ArrayList<String> pagesArray = new ArrayList<String>();
public void loadStory(String storyName){

    //initialize variables
    numCharsLine=0;
    contentString = getStringFromTxtFile(storyName);

    int linesInOnePage = getLinesInPage();//get how many lines will be displayed in one page
    //load story into arraylist pagesArray
    while (contentString != null && contentString.length() != 0) 
    {
        totalPages ++;
        int numChars = 0;
        int lineCount = 0;

        while ((lineCount < linesInOnePage) && (numChars < contentString.length())) {

            numCharsLine = tp.breakText(contentString.substring(numChars), true, pageWidth, null);

            numChars = numChars + numCharsLine;
            lineCount ++;
        }
        // retrieve the String to be displayed in pagesArray
        String toBeDisplayed = contentString.substring(0, numChars);
        contentString = contentString.substring(numChars);
        pagesArray.add(toBeDisplayed);
        numChars = 0;
        lineCount = 0;
    }
    //get the pagecount and reset pageNumber to current page
    totalPages=pagesArray.size();
    pages = new String[pagesArray.size()];
    pages = pagesArray.toArray(pages);  
}

下面是将文本文件的内容加载到字符串

中的方法
    public String getStringFromTxtFile(String fileName) {

    try {
         InputStream is = getAssets().open(fileName+".txt");
         int size = is.available();
         byte[] buffer = new byte[size];
         is.read(buffer);
         is.close();

         return new String(buffer);

         }
         catch (IOException e) {
            throw new RuntimeException(e);
         } 
}

1 个答案:

答案 0 :(得分:0)

现在你正在读取整个文件到字符串,然后将这个字符串拆分成行并处理它。

我建议你联合从文件中读取文本并逐行处理。

例如,使用类LineNumberReader或BufferedReader:

BufferedReader bis = new BufferedReader(new FileReader("my/file/path"));
String line;
while ((line = bis.readLine()) != null) {
    processLine(line); //process current line
}

因此,您不必执行这么多的concat和子字符串操作。