首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AsncTask减缓主(UI)线程

AsncTask减缓主(UI)线程
EN

Stack Overflow用户
提问于 2014-03-13 08:43:57
回答 1查看 1.7K关注 0票数 2

我正在开发一个Android应用程序,它需要解析大量的XML和/或JSON。

每个文件需要3-4秒的解析时间,这是在一个AsyncTask中完成的。然后将解析的数据插入到我的SQlite数据库中。

我的问题是,在解析过程中,UI变得非常慢并且没有响应性。

我已经验证了,使用DDMS,几乎所有的CPU都用于解析,这发生在另一个(AsyncTask)线程中。

我主要是测试一个星系连接,它是缓慢的,但有两个核心。因此,我不明白为什么我会遇到这种UI减速。我仍然能感觉到我的Nexus 7 2013的减速,但这不是一个问题。

你知道我怎样才能解决这个问题的原因吗?当有两个可用的内核时,难道不可能在没有滞后UI的情况下在AsyncTask上有一个很重的负载吗?

代码示例

下面的第一部分启动了Volley,并请求了许多XML文件。

代码语言:javascript
运行
复制
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文件时,将调用以下回调:

代码语言:javascript
运行
复制
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();
        }
    }


}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-13 09:33:55

Android设备的存储I/O性能差是很常见的,如果主线程出于任何原因需要访问驱动器,情况可能会变得缓慢。存储是瓶颈,而不是核心的数量。

使用分析器,以查看哪些方法是缓慢的。您可能会发现UI被卡在从驱动器加载数据。例如,在UI线程上加载位图是很常见的,并且在正常情况下永远不会注意到延迟。在这种情况下,将所有I/O操作从UI线程移开,就像您已经使用了后台数据处理器一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22373251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档