如何让Android等待?

时间:2016-10-16 06:24:57

标签: java android google-maps android-gps

在我的程序中,只要GPS启用就需要接收用户的纬度和经度...我正在使用onGpsStatusChanged来不断检查GPS状态和检查工作......唯一的问题是它试图检索用户位置立即,它返回纬度0.0和经度0.0因为它需要几秒钟来获取这些信息...如果我尝试在一个按钮上使用clickListener几秒后检索它完美地工作..

然后我想:如果我可以让设备等待几秒钟 GPS已启用,然后只检索它可以工作的坐标......

但是:如果我使用另一个Thread或AsyncTask(已经尝试过两者),它会一直为坐标返回0.0,因为真实坐标被缓存到 Map的主要活动线程......

那么,如何让android在主线程中等待?我试过'等(长)'并且应用程序崩溃了。我试图解决这个问题好几个星期,我的时间已经不多了......有些神圣的灵魂会帮助我

3 个答案:

答案 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();