我正在开发一个Android应用程序,它需要解析大量的XML和/或JSON。
每个文件需要3-4秒的解析时间,这是在一个AsyncTask中完成的。然后将解析的数据插入到我的SQlite数据库中。
我的问题是,在解析过程中,UI变得非常慢并且没有响应性。
我已经验证了,使用DDMS,几乎所有的CPU都用于解析,这发生在另一个(AsyncTask)线程中。
我主要是测试一个星系连接,它是缓慢的,但有两个核心。因此,我不明白为什么我会遇到这种UI减速。我仍然能感觉到我的Nexus 7 2013的减速,但这不是一个问题。
你知道我怎样才能解决这个问题的原因吗?当有两个可用的内核时,难道不可能在没有滞后UI的情况下在AsyncTask上有一个很重的负载吗?
代码示例
下面的第一部分启动了Volley,并请求了许多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();
}
当Volley获取了一个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();
}
}
}
发布于 2014-03-13 09:33:55
Android设备的存储I/O性能差是很常见的,如果主线程出于任何原因需要访问驱动器,情况可能会变得缓慢。存储是瓶颈,而不是核心的数量。
使用分析器,以查看哪些方法是缓慢的。您可能会发现UI被卡在从驱动器加载数据。例如,在UI线程上加载位图是很常见的,并且在正常情况下永远不会注意到延迟。在这种情况下,将所有I/O操作从UI线程移开,就像您已经使用了后台数据处理器一样。
https://stackoverflow.com/questions/22373251
复制相似问题