在我的程序中,只要GPS启用就需要接收用户的纬度和经度...我正在使用onGpsStatusChanged来不断检查GPS状态和检查工作......唯一的问题是它试图检索用户位置立即,它返回纬度0.0和经度0.0因为它需要几秒钟来获取这些信息...如果我尝试在一个按钮上使用clickListener几秒后检索它完美地工作..
然后我想:如果我可以让设备等待几秒钟 GPS已启用,然后只检索它可以工作的坐标......
但是:如果我使用另一个Thread或AsyncTask(已经尝试过两者),它会一直为坐标返回0.0,因为真实坐标被缓存到 Map的主要活动线程......
那么,如何让android在主线程中等待?我试过'等(长)'并且应用程序崩溃了。我试图解决这个问题好几个星期,我的时间已经不多了......有些神圣的灵魂会帮助我
答案 0 :(得分:1)
你可以通过使用处理程序
来实现int time=3000 // in milliseconds
Handler h=new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
//here you can do the job
}
},time);
如果您想从处理程序更新用户界面,最终会出现错误,但您可以使用runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
//code to update the ui
}
});
祝你好运
答案 1 :(得分:1)
我不推荐你处理程序,你可以在这里使用接口。 在获得所有值的地方,将其传递给您的活动并使用该活动。
Here我发布了示例,只是尝试按照这种方式使用。
您可以根据需要在此处传递间隔。
public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000
还有一件事你可以通过最快的间隔,也可以帮助你。
谢谢
答案 2 :(得分:0)
我一直在为它创建一个简单的Waiter类。这真的很容易理解,并且做得很好。我将其发布给需要它的人。只需复制Waiter类和WaitListener接口,然后像我展示的那样使用它即可。
这是班级:
import android.os.Handler;
import android.os.Looper;
public class Waiter {
WaitListener waitListener;
int waitTime = 0;
Handler handler;
int waitStep = 1000;
int maxWaitTime = 5000;
boolean condition = false;
public Waiter(Looper looper, final int waitStep, final int maxWaitTime){
handler = new Handler(looper);
this.waitStep = waitStep;
this.maxWaitTime = maxWaitTime;
}
public void start(){
handler.post(new Runnable() {
@Override
public void run() {
waitListener.checkCondition();
if (condition) {
waitListener.onConditionSuccess();
} else {
if (waitTime <= maxWaitTime) {
waitTime += waitStep;
handler.postDelayed(this, waitStep);
} else {
waitListener.onWaitEnd();
}
}
}
});
}
public void setConditionState(boolean condition){
this.condition = condition;
}
public void setWaitListener(WaitListener waitListener){
this.waitListener = waitListener;
}
}
这是接口:
public interface WaitListener {
public void checkCondition();
public void onWaitEnd();
public void onConditionSuccess();
}
例如,您可以像使用它那样进行连接检查:
ConnectivityManager mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final int result = mConnMgr.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableMMS");
final Waiter waiter = new Waiter(getMainLooper(), 1000, 5000);
waiter.setWaitListener(new WaitListener() {
@Override
public void checkCondition() {
Log.i("Connection", "Checking connection...");
NetworkInfo networkInfo = mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS);
waiter.setConditionState(networkInfo.isConnected());
}
@Override
public void onWaitEnd() {
Log.i("Connection", "No connection for sending");
//DO
}
@Override
public void onConditionSuccess() {
Log.i("Connection", "Connection success, sending...");
//DO
}
});
waiter.start();