Я собираю около 1500 графиков данных и добавляю их в оверлеи для просмотра карты. Я хочу запустить это в другом потоке, пока остальная часть моей программы заканчивается. Я хотел бы, чтобы ускоритель прогресса вращался только на части карты, пока он загружал точки графика данных.
Я искал и нашел то, что мне нужно, но я не уверен, как его реализовать и где в моем коде его поставить.
Когда я буду называть методы?
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();
}
}
Из вашего вопроса я на самом деле не на сто процентов уверен, что вы сейчас понимаете в AsyncTask
так что это может быть немного того, что вы уже знаете, но AsyncTask
меня.
"Это происходит в другой задаче или в методе onCreate?": AsyncTask
- это класс, который вы должны подклассифицировать, чтобы делать то, что вам нужно, это не фрагмент кода, который может быть встроен в ваш onCreate
. Вы можете сделать анонимный класс AsyncTask
в своем onCreate, но обычно вы хотите, чтобы он был либо закрытым внутренним классом, либо его собственным классом.
Что касается того, когда вы вызываете методы; вы не являетесь событиями жизненного цикла.
onPreExecute()
вызывается в потоке пользовательского интерфейса непосредственно перед началом фоновой работы и является местом, где можно делать такие вещи, как изменение компонентов, чтобы показать прогресс, или вызвать диалог.
doInBackground(Params...)
- основной метод, который работает в фоновом режиме в другом потоке, выполняйте свою работу здесь. Не пытайтесь изменить интерфейс пользователя здесь.
onPostExecute (Result) - это когда ваша задача завершена и снова запущена в потоке пользовательского интерфейса. Здесь вы должны обработать обновление своего пользовательского интерфейса.
Вы вызываете только execute(Params..)
, который запустит AsyncTask
, передавая объекты, которые вы помещаете в качестве параметров в метод doInBackground(Params...)
задачи. Таким образом, ответ о том, что поставить в качестве параметров, - это то, что вам нужно иметь в doInBackground(Params...)
.
Это должно быть достойным обзором для ваших нужд, но вы должны действительно проверить документы.
Чтобы запустить AsyncTask, вы просто
(new UpdateFeedTask()).execute(activityInstance);
Он может идти туда, где вы его захотите, хотя место, где вы его помещаете, может ограничить доступ к переменным и объектам, с которыми вы хотите взаимодействовать. Например, частный внутренний класс будет иметь к ним доступ, в то время как совершенно новый класс может не иметь такого доступа.
doInBackground(MyActivity... params)
где параметр, который вы передали в функцию execute()
будет идти, и вы можете получить к нему доступ через params[0]
.
Вы не должны вызывать какие-либо методы в классе AsyncTask, кроме execute()
.
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 в манифесте. Это гарантирует, что действие не будет уничтожено, когда задача все еще работает в фоновом режиме. В противном случае задача завершится и отчитается до нулевой активности, если вы не сообщите этой задаче об обратном вызове нового действия.