Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
刷新ListView时Android延迟?_Android_Android Asynctask - Fatal编程技术网

刷新ListView时Android延迟?

刷新ListView时Android延迟?,android,android-asynctask,Android,Android Asynctask,这个想法很简单。创建一个新的TextView,将其附加到ListView,然后开始从服务器下载内容。当没有内容下载时,ListView会立即更新。但在将TextView添加到我开始下载的ListView后,在屏幕上刷新ListView是在下载完成后完成的 主要功能 TextView startingDownloadingText = createTextView("Downloading started"); linearLayout.addView(startingDownloadingTex

这个想法很简单。创建一个新的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;
    }

}
public boolean downloadFromUrl(字符串stringURL,字符串文件名,上下文myContext){
试一试{
URL URL=新URL(字符串URL);
Resources res=myContext.getResources();
字符串envDirectory=Environment.getExternalStorageDirectory().toString();
String zipddirectory=envDirectory.concat(res.getString(R.String.zipddirectory));
File fileDirectory=新文件(zipDirectory);
fileDirectory.mkdirs();
ZipDownloader ZipDownloader=新的ZipDownloader(zipddirectory,fileName);
AsyncTask asynZipDownloader=zipDownloader.execute(url);
布尔成功=null;
试一试{
success=asynZipDownloader.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
如果(成功){
Log.d(“DownloadFromUrl”,“文件准备就绪”);
返回true;
}
返回false;
}捕获(IOE异常){
Log.e(“DownloadFromUrl”,“错误:+e”);
返回false;
}
}
为什么会这样

更新


get()是UI阻塞,在AsyncTask中使用onPostExecute()将以非阻塞方式完成工作。示例:

您似乎正在从
UI线程
下载,请查看
异步任务
,然后尝试实现它。看


当您请求下载时,它会阻塞
UI线程
,直到完成。如果您将其放入一个单独的
AsyncTask
中,那么这将释放您的
UI线程
,您可以调用
UI线程
,以提供结果并更新您的UI

,但在我的主要功能中,我首先调用create view,然后调用async download。在创建完视图后,不应该调用异步下载吗?这与此无关,在UI线程上执行网络操作会降低速度,无论是否先执行网络操作。在您的例子中,这意味着已经创建了ListView,但是您已经阻止了线程到达其绘制周期的末尾,在那里它将调用onDraw()在屏幕上实际呈现列表。您应该完成所有的UI工作,然后启动一个异步任务并等待它在回调中返回。不要忘记,在2.3.3+版本的Android上,您不能在StrictMode的UI线程中使用网络进程。为此,请始终使用AsyncTask或线程