상당한 양의 XML 및/또는 JSON을 구문 분석해야하는 Android 앱에서 작업하고 있습니다.AsncTask 메인 (UI) 스레드가 느려집니다
모든 파일을 구문 분석하는 데 3-4 초가 걸리고이 작업은 AsyncTask에서 수행됩니다. 파싱 된 데이터는 내 SQlite 데이터베이스에 삽입됩니다.
내 문제는 UI가 구문 분석하는 동안 매우 느리고 응답이 없습니다.
DDMS를 사용하여 거의 모든 CPU가 구문 분석에 소비하고 이것이 (AsyncTask) 다른 스레드에서 발생한다는 것을 확인했습니다.
저는 주로 느리지 만 두 개의 코어가있는 은하계 연결을 테스트하고 있습니다. 따라서 나는 왜이 UI가 느려지는지 이해하지 못합니다. 그래도 Nexus 7 2013의 속도 저하는 느낄 수 있지만 문제는별로 없습니다.
이 문제의 원인을 찾기 위해 진행할 수있는 방법이 있습니까? 두 개의 코어를 사용할 수있을 때 느린 UI를 얻지 않고도 AsyncTask에 과부하가 발생하지 않아야합니까?
첫 번째 조각이 아래 발리를 시작하고 XML 파일의 수를 요청
코드 예제.
public static void start_update(final Context context,
Subscription subscription) {
if (updateConnectStatus(context) == NO_CONNECT)
return;
mContext = context;
RequestManager.initIfNeeded(context);
RequestQueue requestQueue = RequestManager.getRequestQueue();
Cursor subscriptionCursor = Subscription.allAsCursor(context
.getContentResolver());
while (subscriptionCursor.moveToNext()) {
Subscription sub = Subscription.getByCursor(subscriptionCursor);
if (subscription == null || sub.equals(subscription)) {
StringRequest jr = new StringRequest(sub.getUrl(),
new MyStringResponseListener(context
.getContentResolver(), sub),
createGetFailureListener());
int MY_SOCKET_TIMEOUT_MS = 300000;
DefaultRetryPolicy retryPolicy = new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
jr.setRetryPolicy(retryPolicy);
// Add the request to Volley
requestQueue.add(jr);
processCounts.incrementAndGet();
}
}
requestQueue.start();
}
발리는 XML은 다음 콜백이 호출 파일 fetced 때 :
static class MyStringResponseListener implements Listener<String> {
static FeedHandler feedHandler = new FeedHandler();
Subscription subscription;
ContentResolver contentResolver;
final JSONFeedParserWrapper feedParser = null;
public MyStringResponseListener(ContentResolver contentResolver,
Subscription subscription) {
this.subscription = subscription;
this.contentResolver = contentResolver;
}
@Override
public void onResponse(String response) {
new ParseFeedTask().execute(response); // Execute the parsing as a AsyncTask
}
private class ParseFeedTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... responses) {
Subscription sub = null;
String response = responses[0];
try {
sub = feedHandler.parseFeed(contentResolver, subscription,
response.replace("", "")); // Remove the Byte Order Mark
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedFeedtypeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Long result) {
decrementProcessCount();
}
}
}
이 무거운 코드는 모두 doInBackground에 있습니까? – tianwei
예. 그리고 파싱 메서드 내부에서 코드가 현재 AsyncTask (메인 스레드가 아니라)라는 스레드에서 실행되고 있음을 볼 수 있습니다. – Markus
코드를 여기에 게시 할 수 있습니까? –