19

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

我在主线程上使用 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);
  }
}

由于上下文不正确,它一直在第六行失败。

4

5 回答 5

18

@Eugene van der Merwe

以下代码对我有用:) -->

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

于 2011-04-27T20:50:56.887 回答
4

上下文是一个提供应用程序运行环境访问权限的对象。在大多数情况下,当您需要从 Android 环境中获取对象时,例如资源、视图、基础设施类等——您需要掌握 Context。

在 Activity 类中获取 Context 实例非常简单——Activity 本身是 Context 的子类,所以你需要做的就是使用 'this' 关键字指向你当前的上下文。

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

于 2010-02-23T20:00:46.027 回答
2

我做了一些更多的研究,有人建议将其传递给线程(不知道为什么我没有想到这一点)。我通过一个参数将它传递给 Geocoder 线程,就这样,它起作用了。

于 2009-12-16T06:53:18.987 回答
1

从 AsyncTask 更新 UI 的问题是您需要当前的活动上下文。但是每次方向变化都会破坏和重新创建上下文。

这是您问题的一个很好的答案:Android AsyncTask 上下文行为

于 2010-10-05T17:19:16.233 回答
0

如果看起来您没有使用参数。您可以使用它来传递 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);
于 2014-05-27T18:33:25.573 回答