这是我的第一个Android应用程序,我发现while循环问题,我试图在我的Android应用程序上使用while循环,但应用程序冻结。
我要做的是跟踪用户位置(使用onlocationChanged)并继续查询该位置,直到查询返回结果。它是一个GIS应用程序,所以我将描述应用程序行为: 应用程序使用监听器" onLocationChangedListener"跟踪用户位置。并将其存储在变量" myPosition"中。我正在使用布尔值" noResults = true"。我将使用方法"查询(myPosition)"在while循环中,此方法有一个回调函数,当找到结果时,它会更改一个布尔值" noResults"为假。循环将继续,直到" noResults"是假的(这意味着查询的回调改变了布尔值)
,这就是我的所作所为:
while(noResults)
{
//myPosition keeps changing
query(myPosition);
//query has a callback that when a result is found it changes noResults to false
}
答案 0 :(得分:1)
我使用" Handler"解决了这个问题。每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);
答案 1 :(得分:0)
也许你应该使用AsyncTask?我不太确定你的问题是什么。
答案 2 :(得分:0)
循环在android(或任何语言)中不是问题。
有两种情况可能是你冻结的原因,
如果你在api中运行网络调用,android会抛出错误并崩溃。您必须在Aysnc Task ot threading
使用try throw catch和exception case来避免应用崩溃和更好的编码技巧。
答案 3 :(得分:0)
运行while主线程上的循环代码冻结UI,并使所有其他进程暂停,使您的应用无响应使用
Threads..
另请注意,您运行的while循环正在默认线程上运行,该线程称为ui线程,因此在短时间运行时,循环在不同的线程上。 例如..
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个,但我不记得最后一个