Как получить Async для запуска потока в фоновом режиме? - PullRequest
1 голос
/ 13 июля 2011

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

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

  1. Что бы я положил в параметры
  2. Идет ли это в другом классе или в моем основном методе создания.
  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();
    }
    }
    

Ответы [ 3 ]

1 голос
/ 13 июля 2011

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

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

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

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

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

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

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

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

0 голосов
/ 13 июля 2011

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

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

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

doInBackground(MyActivity... params)

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

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

0 голосов
/ 13 июля 2011

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

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 к Деятельности в манифесте. Это гарантирует, что действие не будет прервано, когда задача все еще выполняется в фоновом режиме. В противном случае задача завершится и сообщит нулевое действие, если вы не скажете задаче отозвать новое действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...