gpt4 book ai didi

android - 在后台线程中发出的地理定位请求卡住了主线程

转载 作者:行者123 更新时间:2023-11-30 02:38:23 24 4
gpt4 key购买 nike

我的应用程序有以下工作流程:主 Activity 有一个按钮,点击后会启动第二个 Activity 。在第二个 Activity 中有一个 TextView 显示位于指定地理位置的城市。为了找到这个城市,我向 Geocoder 提出请求我在后台线程中制作的。

我的期望第二个 Activity (几乎)立即开始,当后台线程完成请求时,ui 线程更新TextView 内容。

发生了什么:第二个 Activity Geocoder 完成其工作时开始。为明确起见,我们可以关闭 wi-fi 并单击按钮 - 预计需要五六秒,并且在告知 Geocoder 无法获取地理点的消息出现在日志,第二个 Activity 启动。

我做错了什么?相关代码如下,完整示例项目为on github .

public class SecondActivity extends Activity implements Handler.Callback {
private HandlerThread mHandlerThread = new HandlerThread("BackgroundThread");
private Handler mUIHandler;
private Handler mBackgroundHandler;

private TextView mLocationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

mLocationView = (TextView) findViewById(R.id.location_name);

mUIHandler = new Handler(getMainLooper(), this);

mHandlerThread.start();
mBackgroundHandler = new Handler(mHandlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
final Geocoder geocoder = new Geocoder(SecondActivity.this);

try {
final List<Address> results = geocoder.getFromLocation(53.539316, 49.396494, 1);

if (results != null && !results.isEmpty()) {
mUIHandler.dispatchMessage(Message.obtain(mUIHandler, 1, results.get(0)));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
}

@Override
protected void onResume() {
super.onResume();
mBackgroundHandler.dispatchMessage(Message.obtain(mBackgroundHandler, 0));
}

@Override
public boolean handleMessage(Message msg) {
if (msg.what == 1) {
mLocationView.setText("I live in " + ((Address) msg.obj).getLocality());
return true;
}

return false;
}
}

最佳答案

我同意 CommonsWare 的观点,使用 AsyncTask 会让你的生活更轻松。只需根据需要调整参数和返回类型,或者将变量保留在全局范围内。

new AsyncTask<Void, Void, Void>()
{
@Override
protected Void doInBackground(Void... params)
{
// Your Geolocation operation goes here
return null;
}

@Override
protected void onPostExecute(Void result)
{

super.onPostExecute(result);
// This is called when your operation is completed
}
}.execute();

关于android - 在后台线程中发出的地理定位请求卡住了主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26166142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com