Как получить Async для запуска потока в фоновом режиме?

1

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

Я искал и нашел то, что мне нужно, но я не уверен, как его реализовать и где в моем коде его поставить.

  1. Что бы я поставил в params
  2. Это происходит в другом классе или в моем основном методе oncreate.
  3. Когда я буду называть методы?

    private class UpdateFeedTask extends AsyncTask<MyActivity, Void, Void> {
    
    private ProgressDialog mDialog;
    
    protected void onPreExecute() {
        Log.d(TAG, " pre execute async");
        mDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true);
    
    }
    
    protected void onProgressUpdate(Void... progress) {
        Log.d(TAG, " progress async");     
    }
    
    @Override
    protected Void doInBackground(MyActivity... params) {
        // TODO Auto-generated method stub
        return null;
    }
    
    protected void onPostExecute(Void result) {
        Log.d(TAG, " post execute async");
        mDialog.dismiss();
    }
    }
    
Теги:
android-asynctask

3 ответа

1
Лучший ответ

Из вашего вопроса я на самом деле не на сто процентов уверен, что вы сейчас понимаете в AsyncTask так что это может быть немного того, что вы уже знаете, но AsyncTask меня.

"Это происходит в другой задаче или в методе onCreate?": AsyncTask - это класс, который вы должны подклассифицировать, чтобы делать то, что вам нужно, это не фрагмент кода, который может быть встроен в ваш onCreate. Вы можете сделать анонимный класс AsyncTask в своем onCreate, но обычно вы хотите, чтобы он был либо закрытым внутренним классом, либо его собственным классом.

Что касается того, когда вы вызываете методы; вы не являетесь событиями жизненного цикла.

onPreExecute() вызывается в потоке пользовательского интерфейса непосредственно перед началом фоновой работы и является местом, где можно делать такие вещи, как изменение компонентов, чтобы показать прогресс, или вызвать диалог.

doInBackground(Params...) - основной метод, который работает в фоновом режиме в другом потоке, выполняйте свою работу здесь. Не пытайтесь изменить интерфейс пользователя здесь.

onPostExecute (Result) - это когда ваша задача завершена и снова запущена в потоке пользовательского интерфейса. Здесь вы должны обработать обновление своего пользовательского интерфейса.

Вы вызываете только execute(Params..), который запустит AsyncTask, передавая объекты, которые вы помещаете в качестве параметров в метод doInBackground(Params...) задачи. Таким образом, ответ о том, что поставить в качестве параметров, - это то, что вам нужно иметь в doInBackground(Params...).

Это должно быть достойным обзором для ваших нужд, но вы должны действительно проверить документы.

0

Чтобы запустить AsyncTask, вы просто

(new UpdateFeedTask()).execute(activityInstance);

Он может идти туда, где вы его захотите, хотя место, где вы его помещаете, может ограничить доступ к переменным и объектам, с которыми вы хотите взаимодействовать. Например, частный внутренний класс будет иметь к ним доступ, в то время как совершенно новый класс может не иметь такого доступа.

doInBackground(MyActivity... params)

где параметр, который вы передали в функцию execute() будет идти, и вы можете получить к нему доступ через params[0].

Вы не должны вызывать какие-либо методы в классе AsyncTask, кроме execute().

  • 0
    Поэтому я проследил, что в моей программе отображается индикатор выполнения, но он не будет выполнять какой-либо код, такой как setContentView (R.layout.maptabview); mapView = (MapView) findViewById (R.id.mapView); Log.v ( "", "Runnnnnn"); mapView.setBuiltInZoomControls (истинный); mapController = mapView.getController (); mapController.setZoom (4); он будет только выполнять log.v, если я начну с этого
0

1. Что бы я вложил в params. Это зависит. Первый параметр - это то, что займет задача. Последним общим является то, что он вернет.

2. Это происходит в другом классе или в моем основном методе oncreate. Вы вызываете метод execute, когда хотите выполнить задачу. Реализация может быть в классе Activity или в другом.java файле.

3.Когда я бы назвал методы? Вы вызываете только метод execute. Это заставит задачу работать в фоновом режиме. Затем задача будет вызывать onPostExecute, когда это будет сделано.

Вот пример

private class UpdateFeedTask extends AsyncTask<String, Void, DataReturnType> {
    @Override
    protected DataReturnType doInBackground(String... params) {
        String url = params[0];
        //Get data from URL

    }

    @Override
    protected void onPostExecute(ReturnDataType result) {
        //Do something with result
    }
}

Затем вызовите задачу с помощью execute("http://foo.com")

Также добавьте android:configChanges=true для Activity в манифесте. Это гарантирует, что действие не будет уничтожено, когда задача все еще работает в фоновом режиме. В противном случае задача завершится и отчитается до нулевой активности, если вы не сообщите этой задаче об обратном вызове нового действия.

  • 0
    Поэтому я проследил, что в моей программе отображается индикатор выполнения, но он не будет выполнять какой-либо код, такой как setContentView (R.layout.maptabview); mapView = (MapView) findViewById (R.id.mapView); Log.v ( "", "Runnnnnn"); mapView.setBuiltInZoomControls (истинный); mapController = mapView.getController (); mapController.setZoom (4); он только запустит log.v, если я начну с этого.
  • 0
    Вы не хотите помещать какие-либо ссылки на компонент пользовательского интерфейса в задачу (потому что он может быть уничтожен). Я расширил оверлей и сохранил ссылку на это в своей задаче. Затем в конце задачи добавьте наложение в список наложений карты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню