2016-12-13 87 views
0

是否有可能由于某种原因,android操作系统可能会延迟或暂停我的asynctask。如果是这样,我可以做些什么来确保我的任务(例如从数据库获取数据)不会延迟或暂停。可能在UI线程上运行它,但我已经读过它并不是一个好主意,因为它可能会冻结UI并导致延迟。android可以延迟或暂停我的异步任务吗?

+0

它在什么情况下延迟或暂停您的任务? – Victory

+0

我正在从数据库获取数据并填充列表视图。我使用异步任务获取数据,并在异步任务完成后将其存储在数组列表中。我在onPostExecute()函数中调用notifyDataSetChanged()以更新列表视图适配器。大多数时候列表加载正常,但有时会出现延迟(我看到空白屏幕),并在一段时间后listview被更新。 –

+1

你怎么确定它不只是花更长的时间从数据库获取然后预期?磁盘io可能会很慢。 – Victory

回答

2

是否有可能在Android操作系统可能会延迟或暂停我的AsyncTask出于某种原因。

它可能被另一个AsyncTask实例阻塞。默认情况下,他们在一个单一的后台线程运行:https://developer.android.com/reference/android/os/AsyncTask.html

如果是的话我能做些什么,以确保我的任务(如读取数据库数据)不被延迟或暂停。

调查究竟导致延迟。它是doInBackground方法中的内容还是延迟发生在后台操作之前或之后。它可以是任何东西,很难说,没有调试代码。

在UI线程上运行它可能但我已经读过它不是一个好主意,因为它可以冻结UI并导致滞后。

尽管在这种情况下AsyncTask不是一个好的解决方案,但如果您正确实施它,它应该可以正常工作。其他要考虑的方法是Loader s或AsyncQueryHandlerContentProvider。取决于你的用例。

+0

U不完全正确,AsyncTask使用threadPoolExecutor来运行操作,而简单的LinkedBlockingQueue来存储任务,绝对最小值为2个线程,最大为处理器数量的两倍(2 * C + 1),线程以“AsyncTask#”命名,并且在AsyncTask完成后不会终止,而是等待下一个任务。 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L208 – Inverce

+0

感谢您的信息。根据你的链接,有一行:private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; 。 'AsyncTask' *可以使用threadPoolExecutor,但默认行为是串行的。 –

+0

@Inverce'从HONEYCOMB开始,任务在单个线程上执行,以避免由于并行执行导致的常见应用程序错误。'Link [here](https://developer.android.com/reference/android/os/AsyncTask.html )。 – Enzokie

0

@Override protected void onPreExecute(){ holdWait = false; stop = false; }

@Override 
    protected Void doInBackground(Void... params) { 
     synchronized (this) { 
      while(true) { 
       if(Work) return null; 
       if(HaveWork) { 
        //make some 
       } else { 
        try { 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
     return null; 
    } 

    public void mynotify() { 
     synchronized (this) { 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 

    public void setStopWork() { 
     synchronized (this) { 
      stop= false; 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 
} 
+0

我想你不明白我的问题。我没有对asynctask进行任何参考,并且再次运行它,并且开始了。当我的应用程序启动时,我只运行asyctask从数据库获取数据。 –

+0

@DayemSiddiqui @DayemSiddiqui我已更新代码请检查 – user1782565

+0

@DayemSiddiqui可能会帮助你 – user1782565