2013-01-21 43 views
0

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

主要功能

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; 
    } 

} 

这究竟是为什么?

UPDATE

的AsyncTask < ...>。get()方法是UI阻塞和使用的AsyncTask onPostExecute()将做非阻塞的方式工作。示例:android asynctask sending callbacks to ui

回答

1

您似乎是从UI Thread下载的,请看AsyncTask,然后尝试执行该操作。请参阅here

当您请求下载时,它会阻止UI Thread直到完成。如果你把它变成一个独立的AsyncTask那么这将释放你的UI Thread,你可以打电话回UI Thread提供结果和更新UI

+0

但在我的主要功能我首先调用创建视图,然后异步下载。完成创建视图后不应该调用异步下载吗? –

+0

这是无关紧要的,在UI上执行网络操作线程会减慢它是否先到先得。在你的情况下,它意味着已经创建了ListView,但是你已经阻止了线程到达绘制周期的末端,在那里它将调用onDraw()来在屏幕上实际呈现列表。你应该做所有的UI东西,然后开始一个异步任务,并等待它在回调中的返回 –

+0

不要忘记,在2.3.3+ Android版本的StrictMode中,你不能在UI线程中使用网络进程。为此,总是使用AsyncTask或Thread – CinetiK