如何让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();