AsyncTask и контексты - PullRequest
       50

AsyncTask и контексты

19 голосов
/ 16 декабря 2009

Итак, я работаю над своим первым многопоточным приложением на Android с классом AsyncTask. Я пытаюсь использовать его для запуска геокодера во втором потоке, затем обновляю пользовательский интерфейс с помощью onPostExecute, но продолжаю сталкиваться с проблемой с соответствующим контекстом.

Я как-то мешал использовать контексты в главном потоке, но я не совсем уверен, что такое контекст или как его использовать в фоновых потоках, и я не нашел в нем хороших примеров. Любая помощь? Вот выдержка из того, что я пытаюсь сделать:

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

Он продолжает терпеть неудачу на шестой строке там из-за неправильного контекста.

Ответы [ 5 ]

18 голосов
/ 28 апреля 2011

@ Евгений ван дер Мерве

У меня работает следующий фрагмент кода:) ->

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

4 голосов
/ 23 февраля 2010

Контекст - это объект, который обеспечивает доступ к среде выполнения приложения. В большинстве случаев, когда вам нужно получить объекты из среды Android, такие как ресурсы, представления, классы инфраструктуры и т. Д., Вам нужен контекст.

Получить экземпляр Context очень просто, когда вы находитесь в классе Activity - само Activity является подклассом Context, поэтому все, что вам нужно сделать - это использовать ключевое слово this, чтобы указать на текущий контекст ,

Когда вы создаете код, который может требовать Context - вы должны позаботиться о том, чтобы передать объект Context из вашего родительского Activity. В случае вашего примера вы можете добавить явный конструктор, который принимает Context в качестве входного аргумента.

2 голосов
/ 16 декабря 2009

Я провел еще какое-то исследование, и кто-то предложил передать его в ветку (не знаю, почему я об этом не подумал). Я передал его в поток геокодера через аргумент, и вот так он сработал.

1 голос
/ 05 октября 2010

Проблема с обновлением пользовательского интерфейса из AsyncTask заключается в том, что вам нужен текущий контекст активности. Но контекст разрушается и воссоздается при каждом изменении ориентации.

Вот хороший ответ на ваш вопрос: Контекстное поведение Android AsyncTask

0 голосов
/ 27 мая 2014

Если не похоже, что вы используете параметры. Вы можете использовать это, чтобы передать 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);
...