【问题标题】:Android delay when refreshing ListView?刷新ListView时Android延迟?
【发布时间】:2013-01-21 16:20:57
【问题描述】:

这个想法很简单。创建一个新的 TextView,将其附加到 ListView,然后开始从服务器下载内容。当没有内容下载时,ListView 会立即更新。但是将 TextView 添加到我开始下载的 ListView 后,下载完成后刷新屏幕上的 listView 完成。

主要功能

TextView startingDownloadingText = createTextView("Downloading started");
linearLayout.addView(startingDownloadingText);
boolean success = downloadFromUrl(stringUri, fileName, context);
if (success) {......

下载功能

public boolean downloadFromUrl(String stringURL, String fileName, Context myContext) { 

    try {
        URL url = new URL(stringURL);             
        Resources res = myContext.getResources();
        String envDirectory = Environment.getExternalStorageDirectory().toString();
        String zipDirectory = envDirectory.concat(res.getString(R.string.zipDirectory));

        File fileDirectory = new File(zipDirectory);
        fileDirectory.mkdirs();

        ZipDownloader zipDownloader = new ZipDownloader(zipDirectory, fileName);
        AsyncTask<URL, Void, Boolean> asynZipDownloader = zipDownloader.execute(url);
        Boolean success = null;
        try {
            success = asynZipDownloader.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        if (success){
            Log.d("DownloadFromUrl", "file ready");
            return true;
        }
        return false;
    } catch (IOException e) {
        Log.e("DownloadFromUrl", "Error: " + e);
        return false;
    }

}

为什么会这样?

更新

AsyncTask<...>.get() 是 UI 阻塞,在 AsyncTask 中使用 onPostExecute() 将以非阻塞方式完成工作。示例:android asynctask sending callbacks to ui

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    您似乎是从UI Thread 下载的,请查看AsyncTask 并尝试实施它。见here

    当您请求下载时,它会阻止 UI Thread 直到完成。如果你把它放到一个单独的AsyncTask 中,那么这会释放你的UI Thread,你可以回调到UI Thread 以提供结果并更新你的用户界面

    【讨论】:

    • 但在我的主要功能中,我首先调用创建视图,然后调用异步下载。视图创建完成后不应该调用异步下载吗?
    • 这无关紧要,在 UI 线程上执行网络操作会减慢它是否先到先得。在您的情况下,这意味着 ListView 已创建,但您已阻止 Thread 到达其绘制周期的末尾,它将调用 onDraw() 以实际在屏幕上呈现列表。你应该做所有的 UI 工作,然后启动一个异步任务并在回调中等待它的返回
    • 不要忘记,在 2.3.3+ 版本的 Android 上,使用 StrictMode 的 UI 线程中不能有网络进程。始终为此目的使用 AsyncTask 或 Thread
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2013-04-19
    相关资源
    最近更新 更多