我的应用程序有以下工作流程:主活动有一个按钮,单击后启动第二个活动。在第二个活动中,有一个TextView
显示位于指定地理点的城市。为了找到这个城市,我向我在后台线程中提出的Geocoder提出了一个请求。
我的期望:第二个活动(几乎)立即开始,当后台线程完成请求时,ui线程更新TextView
内容。
会发生什么:第二个活动只有在Geocoder
完成其工作时才开始。为了清楚起见,我们可以关闭 wi-fi 并单击按钮 - 预计五六秒,Geocoder
在日志中出现无法获取地理点的消息后,第二个活动启动。
我做错了什么?相关代码如下,完整的示例项目在 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;
}
}