异步任务和上下文

因此,我正在使用Android和AsyncTask类开发我的第一个多线程应用程序。我试图使用它在第二个线程中启动地理编码器,然后使用onPostExecute更新UI,但我一直遇到正确上下文的问题。

我在主线程上使用上下文有点蹒跚,但我不完全确定上下文是什么,或者如何在后台线程上使用它,而且我没有找到任何好的例子。有什么帮助吗?以下是我正在尝试执行的操作的摘录:

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);
  }
}

它在那里的第六行一直失败,因为上下文不正确。


答案 1

@Eugene 范德梅尔韦

下面的代码段对我有用:) -->

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


答案 2

上下文是一个对象,它提供对应用程序运行时环境的访问。在大多数情况下,当您需要从Android环境中获取对象(例如资源,视图,基础架构类等)时,您需要将上下文掌握在手中。

当您在 Activity 类中时,获取 Context 实例非常简单 - 活动本身是 Context 的子类,因此您需要做的就是使用 'this' 关键字指向当前上下文。

无论你创建可能需要上下文的代码 - 你应该注意从你的父活动传递上下文对象。在您的示例中,您可以添加接受上下文作为输入参数的显式构造函数。


推荐