android while循环替代方案

android while循环替代方案,android,while-loop,Android,While Loop,这是我的第一个Android应用程序,我发现while loop有问题,我试图在我的Android应用程序上使用while loop,但应用程序冻结了 我试图做的是跟踪用户位置(使用onlocationChanged)并继续查询该位置,直到查询返回结果。这是一个GIS应用程序,因此我将描述应用程序的行为: 应用程序使用侦听器“onLocationChangedListener”跟踪用户位置,并将其存储在变量“myPosition”中。我使用的是布尔值“noResults=true”。我将在whi

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

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

,以下是我所做的:

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

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

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

有两种情况可能是你冻僵的原因

  • 若在api中运行网络调用,android会抛出错误并崩溃。您必须在Aysnc任务中执行与网络相关的调用

  • 使用try-throw捕获和异常情况来避免应用程序崩溃,并提高编码技能


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

    Threads..
    
    还要注意,您正在运行的while循环运行在一个名为ui线程的默认线程上,因此在短期内while循环运行在单独的线程上。。 例如

    用于用户界面通信方法

    View.post(new Runnable() {
    
        @Override
        public void run() {
        // TODO Auto-generated method stub
        Toast.makeText(getActivity(), "updated ui", Toast.LENGTH_LONG).show();
        }
    });    
    
    视图可以是您正在更新的任何视图。。
    另外,正如@TechCoder所说,您可以使用asynctask,但asynctask不适用于长时间工作。下面的工作有3个,但我记不起最后一个了。

    我使用每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);
    

    在此处共享您的代码。请在此处发布您的代码,当您的问题涉及技术问题时,请记住始终共享代码。请尝试在辅助线程中获取位置,而不是在主线程中获取位置。您将“while”放在何处?若有,;在onCreate中,您正在阻止主线程!!!请检查编辑问题是这是一个很长的工作流程,我读到AsyncTask应该用于简短的工作流程
       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);