我正在研究Android應用程序,它需要解析大量的XML和/或JSON。AsncTask減慢主要(UI)線程
每個文件都需要3-4秒才能解析,這是在AsyncTask中完成的。解析的數據然後被插入到我的SQlite數據庫中。
我的問題是,UI在分析過程中變得非常緩慢且無響應。
我已經驗證,使用DDMS,幾乎所有的CPU都花費解析,而這發生在另一個(AsyncTask)線程中。
我主要是測試一個速度慢,但有兩個核心的星系連結。因此我不明白爲什麼我遇到這個UI放緩。我仍然可以感受到我的Nexus 7 2013的速度放慢,但它的問題要少得多
你知道我該如何解決這個問題嗎?當有兩個內核可用時,不應該在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();
}
當排球已經fetced一個XML文件中的下列回調被稱爲:
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
您可以在這裏發佈代碼嗎? –