Android:让应用程序等待,直到找到当前位置

Android:让应用程序等待,直到找到当前位置,android,android-location,Android,Android Location,我正在尝试让我的应用程序等待找到当前位置。我用线程尝试了几种不同的方法,但都失败了。我正在使用wait()和notify()但应用程序刚刚挂起,从未找到当前位置 我不使用GoogleMapAPI,因为它不是应用程序的一部分。有没有人知道怎么做,或者举个例子 编辑:直到用户按下按钮,然后在onLocationChanged内处理其他数据,例如将新位置添加到ArrayList,我使用的线程才启动,计算当前位置和上一个位置之间的距离以及到达新位置所需的时间您可以尝试在onCreate中启动异步任务,以

我正在尝试让我的应用程序等待找到当前位置。我用
线程尝试了几种不同的方法,但都失败了。我正在使用
wait()
notify()
但应用程序刚刚挂起,从未找到当前位置

我不使用GoogleMapAPI,因为它不是应用程序的一部分。有没有人知道怎么做,或者举个例子


编辑:直到用户按下按钮,然后在
onLocationChanged
内处理其他数据,例如将新位置添加到ArrayList,我使用的
线程才启动,计算当前位置和上一个位置之间的距离以及到达新位置所需的时间

您可以尝试在
onCreate
中启动
异步任务
,以获取位置。默认的
onCreate
布局可以是一个“加载”页面,然后当
AsyncTask
成功完成时,它会绘制出您的“真实”UI。

因此,如果我正确理解您想要做什么,那么我将避免在
onClick()
中创建另一个线程。相反,
onClick()。因为您要做的工作是在收到新位置后进行的,所以我会在那里启动一个异步任务。然后,当异步任务完成时,您最终移除对话框(移除它会将控制权返回给用户)

代码通常会有所帮助,因此,我会将其放在onCreate()或任何地方:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        listener.refresh();
    }
});
然后把这个放在你的位置Listener:

public void refresh() {
    myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    myDialog = new ProgressDialog(myContext);
    myDialog.setIndeterminate(true);
    myDialog.show();
}

@Override
public void onLocationChanged(Location location) {
    // now do work with your location, 
    // which your probably want to do in a different thread
    new MyAsyncTask().execute(new Location[] { location });
}
然后您需要一个AsyncTask,它可能如下所示:

class MyAsyncTask extends AsyncTask<Location, Void, Void> {
    @Override
    protected Void doInBackground(Location... location) {
        // start doing your distance/directions/etc work here
        return null;
    }


    @Override
    protected void onPostExecute(Void v) {
        // this gets called automatically when you're done, 
        // so release the dialog box
        myDialog.dismiss();
        myDialog = null;
    }
}
类MyAsyncTask扩展了AsyncTask{ @凌驾 受保护的空位背景(位置…位置){ //开始在这里进行距离/方向/等工作 返回null; } @凌驾 受保护的void onPostExecute(void v){ //完成后会自动调用它, //所以释放对话框 myDialog.disclose(); myDialog=null; } }
对于AsyncTask这类东西非常陌生,但可以肯定,它可以在onClick而不是onCreate上工作。这正是我们想要的方法,可能会弹出一个进度对话框或类似的对话框。您是否正在使用GPS和LocationManager、LocationListener等?我这样问是因为很难理解为什么不将代码放在LocationListener.onLocationChanged()中,这是在找到当前位置时调用的。是的,我让locationManager等工作,但当用户按下按钮获取位置时,我希望它等到找到当前位置后,才会发生任何事情或其他事情。我应该在问题中包含这个细节。有点像,我只希望线程/asyncTask运行一次以找到设备的初始位置,然后使用
onLocationChanged
提供所有后续位置。因为如果我使用了
getLastKnownLocation(字符串提供程序)
可能会导致相当大的错误。@Droid\u Interceptor是的,
getLastKnownLocation()
有时数据会非常旧(比如24小时旧)。但我不确定您是否需要线程/
AsyncTask
。只需调用
requestLocationUpdates()
。当你找到一个位置时,Android将调用
onLocationChanged()
。Android使用的回调系统的目的是,您不需要线程来等待
AsyncTask
是为了做积极的工作,而不是等待GPS。谢谢@Steve Blackwell我想我只需要再尝试一下,只是昨晚有点沮丧。我认为主要的问题可能是LocationListener被实现为一个独立的类,而不是一个内部类,因此它与活动分离,因此调用getCurrentLocation()方法在获取位置之前返回null。