如何让安卓等待?

Posted

技术标签:

【中文标题】如何让安卓等待?【英文标题】: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() 上的坐标,我想它也可以工作...谢谢! 【参考方案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();

【讨论】:

以上是关于如何让安卓等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何让异步/等待等待我的嵌套数组填充

如何让这个函数等待 JSON 数据准备好

Dart:你如何让 Future 等待 Stream?

如何让程序等待一段时间? [复制]

如何让函数等待事件发生?

你如何让 Swift 等待 SKAction 被执行?