2012-08-29 13 views
5

Tôi có một tệp JSON xấp xỉ 1MB được lưu trữ trong thư mục nội dung mà tôi cần tải trong ứng dụng của mình mỗi lần chạy. Tôi thấy rằng trình phân tích cú pháp JSON tích hợp (org.json) phân tích cú pháp tệp rất chậm, tuy nhiên khi nó được phân tích cú pháp, tôi có thể truy cập và thao tác dữ liệu rất nhanh. Tôi đã tính được khoảng 7 hoặc 8 giây kể từ thời điểm tôi nhấp vào ứng dụng vào thời điểm Activity1 được đưa lên, nhưng chỉ mất vài phần nghìn giây để chuyển từ Activity1 sang Activity2 phụ thuộc vào dữ liệu được xử lý từ dữ liệu được tải Hoạt động 1.Phân tích cú pháp ~ 1 MB JSON trên Android rất chậm

Tôi đang đọc các tập tin vào bộ nhớ và phân tích nó bằng cách sử:

String jsonString = readFileToMemory(myFilename) 
JSONArray array = new JSONArray(jsonString); 

nơi readFileToMemory (String) trông như thế này:

private String readFileToMemory(String filename) { 
    StringBuilder data = new StringBuilder();  
    BufferedReader reader = null; 
    try { 
     InputStream stream = myContext.getAssets().open(filename); 
     reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
     int result = 0; 
     do 
     { 
      char[] chunk = new char[512]; 
      result = reader.read(chunk); 
      data.append(chunk); 
     } 
     while(result != -1); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return data.toString(); 
} 

Có ai có bất cứ đề nghị để làm thế nào tôi có thể tăng tốc tăng tải và phân tích dữ liệu ban đầu? Tôi có nên che giấu toàn bộ quá trình đằng sau màn hình tải không?

+0

Có vi optimisations bạn có thể làm , như 'data.ensureCapacity (stream.available())' và tạo các đoạn 8K hoặc 64K của bạn, v.v., nhưng thực sự điều tốt hơn sẽ là nối tiếp dữ liệu của bạn hoặc lưu nó vào một bảng SQL sau khi phân tích cú pháp, sau đó sử dụng nó trừ khi bạn phát hiện rằng tệp JSON đã được cập nhật. –

Trả lời

2

Bạn nên tạo một bảng SQLite để lưu trữ dữ liệu và di chuyển nó từ JSON sang SQL trong lần đầu tiên ứng dụng chạy. Là một lợi ích bổ sung, điều này làm cho dữ liệu dễ dàng hơn để tìm kiếm và giúp bạn có thể sửa đổi dữ liệu từ bên trong ứng dụng.

+0

Có, hãy thử SQLite hoặc phân tách JSON của bạn thành JSON nhỏ. – neohope

8

JSONObject - từ json.org, là API đơn giản nhất để sử dụng để phân tích cú pháp JSON. Tuy nhiên nó đi kèm với một chi phí - performace. Tôi đã thực hiện các thí nghiệm mở rộng với JSONObject, Gson và Jackson. Dường như không có vấn đề gì bạn làm, JSONObject (và do đó JSONArray) sẽ là chậm nhất. Vui lòng chuyển sang Jackson hoặc Gson.

Đây là hiệu suất tương đối của hai

(nhanh nhất) Jackson > Gson >> JSONObject (chậm nhất)

Tham khảo:
- Jackson
- Gson

+0

Jackson có thể được sử dụng mà không có POJO không? LIke Hiện tại tôi đang sử dụng JSONObject, để đọc từng tệp json của tôi, và thực hiện chèn thêm db - (Không có lớp). Tôi có thể sử dụng Jackson cùng một cách để đọc các đối tượng json/mảng từng cái một và phân tích cú pháp, chèn db? –

+0

Có. Vui lòng đọc tài liệu tại đây. http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectMapper.html#readTree(java.lang.String) – Nishant

+0

Liên kết Jackson bị hỏng – VVB

Các vấn đề liên quan