2014-10-15 3 views
-3

Это мое первое приложение для Android, и я нахожу проблемы с циклом while, я пытаюсь использовать цикл while в приложении для Android, но приложение зависает.android while loop alternative

То, что я пытаюсь сделать, - это отслеживать местоположение пользователя (используя onlocationChanged) и продолжать запрашивать местоположение, пока запрос не вернет результат. Это приложение GIS, поэтому я расскажу о поведении приложения: приложение отслеживает позицию пользователя, используя прослушиватель «onLocationChangedListener» и сохраняет его в переменной «myPosition». Я использую boolean «noResults = true». Я буду использовать метод «query (myPosition)» в цикле while, этот метод имеет обратный вызов, который, когда результат найден, и изменяет логические «noResults» на false. цикл не будет продолжать до тех пор, «noResults» ложно (это означает, что обратный вызов Query изменилось значение булевой) в

, вот что я сделал:

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

акций вам код здесь. – codePG

+0

Пожалуйста, разместите здесь свой код и всегда помните, чтобы делиться кодом, когда ваш вопрос касается технических вещей. –

+0

попытайтесь найти место во вторичном потоке, а не в главной теме –

ответ

0

работает, а коды петли на основной поток зависает интерфейс, и делает все другие процессы приостановки делает ваше приложение не отвечает на запросы Используйте

Threads.. 

также отметить, что цикл в то время как вы работаете работает на по умолчанию Thread называют как поток пользовательского интерфейса, так в краткосрочной перспективе, а петли на отдельные потоки .. например ..

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 не предназначена для длительного workaflow работы есть три из них, но я не могу вспомнить последний один

0

Может быть, вы должны использовать AsyncTask? Я не совсем понимаю, в чем твоя проблема.

+1

Проблема в том, что это длинная работа workllow, и я читал, что AsyncTask следует использовать для кратких workaflows –

0

Loop не является проблемой для android (или любого языка).

Есть два сценария может быть причиной для замораживания,

  1. При запуске сетевого вызова API, андроид ошибки броска и падает. Вы должны выполнять связанные с сетью вызовы в Aysnc Задача с потоком

  2. Используйте try catch catch и исключения, чтобы избежать сбоя приложения и лучшего навыка кодирования.

1

Я решил проблему с помощью «укротителя», запрашивающий Feature Layer каждых 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);