0

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

我没有使用 google map api,因为它不是应用程序的一部分。有没有人有任何想法如何做到这一点或例子。

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

4

2 回答 2

2

您可以尝试开始获取位置AsyncTaskonCreate您的默认onCreate布局可能是“加载”页面,然后当您AsyncTask成功完成该位置时,它会绘制您的“真实”用户界面。

于 2012-01-30T20:45:03.190 回答
0

因此,如果我理解您想要正确执行的操作,那么我会避免在onClick(). 相反,onClick()应该只请求一个位置,显示一个进度对话框,然后返回。由于您想要做的工作是在您收到新位置后发生的,所以我会在那里启动一个 AsyncTask。然后,当 AsyncTask 完成时,您最终会删除对话框(删除它会将控制权返回给用户)。

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

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        listener.refresh();
    }
});

并将其放入您的 LocationListener 中:

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;
    }
}
于 2012-01-30T22:49:26.083 回答