如何让Android等待?
How to make Android wait?
在我的程序中,需要在启用 GPS 后立即接收用户纬度和经度...我正在使用 onGpsStatusChanged 不断检查 GPS 状态并且检查有效...唯一的问题是它尝试检索用户位置 立即 ,并且它 returns 纬度 0.0 和经度 0.0 导致获取这些信息需要几秒钟......如果我尝试在几秒钟后使用按钮上的 clickListener 完美运行...
然后我想:如果我能让设备在 启用 GPS 后等待几秒钟,然后再检索坐标它就会工作...
但是:如果我使用另一个 Thread 或 AsyncTask(已经尝试过),它会一直返回 0.0 坐标,因为真实坐标被缓存到 Map 的 Main Activity 线程...
那么,如何让android在主线程中等待?我试过 'wait(long)' 并且应用程序崩溃了。我已经尝试解决这个问题好几个星期了,我的时间已经 运行 了...请一些神圣的灵魂帮助我
你可以通过使用处理程序来实现
int time=3000 // in milliseconds
Handler h=new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
//here you can do the job
}
},time);
如果您想从处理程序更新 UI,您最终会遇到错误,但您可以使用 runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
//code to update the ui
}
});
祝你好运
我不推荐你处理程序,你可以在这里使用接口。
在你获得所有值的地方使用它传递给你的 activity 并使用那个。
我已经发布了示例,只是尝试按照这种方式使用。
这里可以根据自己的需要设置interval。
public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000
还有一件事你可以通过最快的间隔,这对你也有帮助。
谢谢
我一直在为它创建一个简单的 Waiter class。它真的很容易理解并且做得很好。我post它给那些需要它的人。只需复制 Waiter class 和 WaitListener 接口并像我展示的那样使用它。
这是Class:
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();
在我的程序中,需要在启用 GPS 后立即接收用户纬度和经度...我正在使用 onGpsStatusChanged 不断检查 GPS 状态并且检查有效...唯一的问题是它尝试检索用户位置 立即 ,并且它 returns 纬度 0.0 和经度 0.0 导致获取这些信息需要几秒钟......如果我尝试在几秒钟后使用按钮上的 clickListener 完美运行...
然后我想:如果我能让设备在 启用 GPS 后等待几秒钟,然后再检索坐标它就会工作...
但是:如果我使用另一个 Thread 或 AsyncTask(已经尝试过),它会一直返回 0.0 坐标,因为真实坐标被缓存到 Map 的 Main Activity 线程...
那么,如何让android在主线程中等待?我试过 'wait(long)' 并且应用程序崩溃了。我已经尝试解决这个问题好几个星期了,我的时间已经 运行 了...请一些神圣的灵魂帮助我
你可以通过使用处理程序来实现
int time=3000 // in milliseconds
Handler h=new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
//here you can do the job
}
},time);
如果您想从处理程序更新 UI,您最终会遇到错误,但您可以使用 runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
//code to update the ui
}
});
祝你好运
我不推荐你处理程序,你可以在这里使用接口。 在你获得所有值的地方使用它传递给你的 activity 并使用那个。
这里可以根据自己的需要设置interval。
public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000
还有一件事你可以通过最快的间隔,这对你也有帮助。
谢谢
我一直在为它创建一个简单的 Waiter class。它真的很容易理解并且做得很好。我post它给那些需要它的人。只需复制 Waiter class 和 WaitListener 接口并像我展示的那样使用它。
这是Class:
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();