所以我正在使用Android和AsyncTask类开发我的第一个多线程应用程序。我正在尝试使用它在第二个线程中触发Geocoder,然后使用onPostExecute更新UI,但我一直遇到正确的Context问题。
我在主线程上使用Contexts有点蠢蠢欲动,但我不确定Context是什么或如何在后台线程上使用它,我还没有找到任何好的例子。有帮助吗?以下是我正在尝试做的摘录:
public class GeoCode extends AsyncTask<GeoThread, Void, GeoThread> {
@Override
protected GeoThread doInBackground(GeoThread... i) {
List<Address> addresses = null;
Geocoder geoCode = null;
geoCode = new Geocoder(null); //Expects at minimum Geocoder(Context context);
addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1);
}
}
由于背景不正确,它在第六行仍然失败。
答案 0 :(得分:18)
@Eugene van der Merwe
以下代码对我有用:) - &gt;
public class ApplicationLauncher extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.applicationlauncher);
LoadApplication loadApplication = new LoadApplication(this);
loadApplication.execute(null);
}
private class LoadApplication extends AsyncTask {
Context context;
ProgressDialog waitSpinner;
ConfigurationContainer configuration = ConfigurationContainer.getInstance();
public LoadApplication(Context context) {
this.context = context;
waitSpinner = new ProgressDialog(this.context);
}
@Override
protected Object doInBackground(Object... args) {
publishProgress(null);
//Parsing some stuff - not relevant
configuration.initialize(context);
return null;
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
// Only purpose of this method is to show our wait spinner, we dont
// (and can't) show detailed progress updates
waitSpinner = ProgressDialog.show(context, "Please Wait ...", "Initializing the application ...", true);
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
waitSpinner.cancel();
}
}
}
干杯,
Ready4Android
答案 1 :(得分:4)
Context是一个提供应用程序运行时环境加入的对象。在大多数情况下,当您需要从Android环境中获取对象时,例如资源,视图,基础结构类等 - 您需要掌握Context。
当你在Activity类中时,获取Context实例非常简单 - Activity本身是Context的子类,所以你需要做的就是使用'this'关键字指向你当前的上下文。
当您创建可能需要Context的代码时 - 您应该注意从父Activity传递Context对象。在您的示例中,您可以添加显式构造函数,该构造函数接受Context作为输入参数。
答案 2 :(得分:2)
我做了一些更多的研究,有人建议将它传递给线程(不知道为什么我没有想到这一点)。我通过一个参数将它传递给了Geocoder线程,就这样,它起作用了。
答案 3 :(得分:1)
从AsyncTask更新UI的问题是您需要当前活动上下文。但是每个方向的变化都会破坏并重新创建上下文。
以下是您的问题的一个很好的答案:Android AsyncTask context behavior
答案 4 :(得分:0)
如果看起来不像你正在使用params。您可以使用它来传递Conetxt。
public class GeoCode extends AsyncTask<Context, Void, GeoThread> {
@Override
protected GeoThread doInBackground(Context... params) {
List<Address> addresses = null;
Geocoder geoCode = null;
geoCode = new Geocoder(params[0]); //Expects at minimum Geocoder(Context context);
addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1);
}
}
然后从你的活动中:
GeoCode myGeoCode = new GeoCode();
myGeoCode.execute(this);