【问题标题】:android while loop alternativeandroid while循环替代
【发布时间】:2014-10-15 09:03:19
【问题描述】:

这是我的第一个 Android 应用程序,我发现 while 循环有问题,我试图在我的 Android 应用程序上使用 while 循环,但应用程序冻结了。

我要做的是跟踪用户位置(使用 onlocationChanged)并继续查询该位置,直到查询返回结果。这是一个 GIS 应用程序,所以我将描述应用程序的行为: 应用程序使用侦听器“onLocationChangedListener”持续跟踪用户位置,并将其存储在变量“myPosition”中。我正在使用布尔值“noResults = true”。我将在 while 循环中使用方法“query(myPosition)”,该方法有一个回调,当找到结果时,将布尔值“noResults”更改为 false。循环将一直持续到“noResults”为假(这意味着查询的回调改变了布尔值)

,这就是我所做的:

while(noResults)
{
//myPosition keeps changing 
      query(myPosition);
//query has a callback that when a result is found it changes noResults to false
}

【问题讨论】:

  • 在这里分享你的代码。
  • 请在此处发布您的代码,当您的问题涉及技术问题时,请记住始终共享代码。
  • 尝试在辅助线程中获取位置,而不是在主线程中
  • 你把你的“while”放在哪里了?如果它在 onCreate 你阻塞了主线程!!!
  • 请检查编辑

标签: android while-loop


【解决方案1】:

我使用“处理程序”解决了这个问题,它每 5 秒查询一次要素层,这会阻止主线程生成应用程序无响应错误:

   Handler m_handler=new Handler();
    Runnable m_runnable;
    m_runnable = new Runnable(){
   public void run() {

  //query code here
m_handler.postDelayed(m_runnable, 5000);

    }
   };
  m_handler.postDelayed(m_runnable, 0);

【讨论】:

    【解决方案2】:

    在主线程上运行 while 循环代码会冻结 UI,并使所有其他进程暂停,从而使您的应用无响应使用

    Threads..
    

    还请注意,您正在运行的 while 循环在称为 ui 线程的默认线程上运行,因此在短期内运行 while 循环在单独的线程上.. 比如……

    new Thread(new Runnable() {
    
        @Override
        public void run() {
        // Your hard while loop here
        //get whatever you want and update your ui with ui communication methods.
        }
    ).start();
    

    用于ui通信方式

    View.post(new Runnable() {
    
        @Override
        public void run() {
        // TODO Auto-generated method stub
        Toast.makeText(getActivity(), "updated ui", Toast.LENGTH_LONG).show();
        }
    });    
    

    视图可以是您正在更新的任何视图.. 也像@TehCoder 说你可以使用 asynctask 但 asynctask 不适合长时间的工作流程工作,其中有 3 个,但我不记得最后一个了

    【讨论】:

      【解决方案3】:

      也许您应该使用 AsyncTask?我不太确定你的问题是什么。

      【讨论】:

      • 问题是它是一个很长的工作流工作,我读到 AsyncTask 应该用于简短的工作流
      【解决方案4】:

      循环在 android(或任何语言)中不是问题。

      有两种情况可能是您冻结的原因,

      1. 如果在 api 中运行网络调用,android 会抛出错误并崩溃。您必须在 Aysnc Task ot threading 中进行网络相关调用

      2. 使用 try throw catch 和异常情况来避免应用崩溃和更好的编码技巧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 2019-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-27
        相关资源
        最近更新 更多