如何让安卓等待?
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();
【讨论】:
以上是关于如何让安卓等待?的主要内容,如果未能解决你的问题,请参考以下文章