【问题标题】:How to make Android wait?如何让安卓等待?
【发布时间】:2017-02-25 07:45:19
【问题描述】:

在我的程序中,一旦启用 GPS,就需要接收用户纬度和经度...我正在使用 onGpsStatusChanged 不断检查 GPS 状态并且检查工作正常...唯一的问题是它试图立即检索用户位置,它返回纬度 0.0 和经度 0.0,因为获取这些信息需要几秒钟... .

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

但是:如果我使用另一个 Thread 或 AsyncTask(已经尝试过),它会一直返回 0.0 的坐标,因为真正的坐标被缓存到 Map 的 Main Activity 线程中......

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

【问题讨论】:

  • developer.android.com/reference/android/location/… 我刚刚看了一点,看来您可以请求更新未决意图。
  • 您可以尝试使用处理程序发布延迟的可运行文件,并确保它在 ui 线程上运行。
  • 不要让 UI 线程等待,这很糟糕。如果您使用了 AsyncTask,则在 doInBackground() 中执行 onGpsStatusChanged 并更新 onPostExecute() 中的坐标,这将在主 UI 线程上运行,并在 doInBackground() 之后自动执行。这样你就不必显式地让 UI 线程等待
  • @PaulKaram,我不知道该怎么做......我是 Android 开发的新手...... shubhankars,Mohamed 为我举例说明了它,它完美地工作!非常感谢你
  • 哇,我没想到这个解决方案...我正在更新 doInBackground() 上的坐标,我想它也可以工作...谢谢!

标签: java android google-maps android-gps


【解决方案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);

如果您想从处理程序更新 UI,您最终会遇到错误,但您可以使用runOnUiThread

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //code to update the ui
    }
});

祝你好运

【讨论】:

  • 天啊! 2 周的 noobing == 15 分钟的专家谈话……效果很好!非常感谢您的帮助!
【解决方案2】:

我不推荐你处理程序,你可以在这里使用接口。 获取所有值的地方,将其传递给您的活动并使用该活动。

Here我已经发布了示例,只是尝试遵循并使用这种方式。

你可以根据需要在这里传递区间。

public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000

还有一件事你可以通过最快的间隔也对你有帮助。

谢谢

【讨论】:

    【解决方案3】:

    我一直在为它创建一个简单的 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2012-09-25
      • 2016-06-02
      • 2016-10-29
      • 2013-04-03
      • 1970-01-01
      相关资源
      最近更新 更多