2013-08-18 3 views
3

У меня есть код, использующий класс AsyncTask для заполнения спискаView с несколькими контактами из базы данных.Android - класс AsyncTask и метод Execute

@Override 
    protected void onResume() 
    { 
     super.onResume(); 

     new MyTask().execute((Object[]) null); 
    } // end method onResume 

1.- Почему я прохожу это: (Object[]) null) в качестве аргумента?

Смотрите код AsyncTask:

private class MyTask extends AsyncTask<Object, Object, Cursor> 
    { 
     //used for database conection purpose 
     ConectToDatabase databaseConnector = 
     new ConectToDatabase(ThisClass.this); 


     @Override 
     protected Cursor doInBackground(Object... params) 
     { 
     databaseConnector.open(); 

     return databaseConnector.getMyContacts(); 
     } 

     // use the Cursor returned from the doInBackground method 
     @Override 
     protected void onPostExecute(Cursor result) 
     { 
     //My cursorAdadper defined in early code 
     contactAdapter.changeCursor(result); 
     databaseConnector.close(); 
     } 
    } 

Другой AsyncTask вопрос:

delete.execute(new Long[] { rowID }); 

2.- Почему я прохожу это: (new Long[] { rowID }) в качестве аргумента, а не просто (RowId)?

rowID - длинный тип, который содержит идентификатор контакта, выбранного в моем предыдущем классе. Это расширилось в ListActivity. Этот предыдущий класс был заполнен всеми моими контактами, полученными в моей базе данных. Когда я отправляю данные в этом классе (по намерению), я хочу восстановить данные одного контакта, выбранного в моем предыдущем классе, но в этом случае код выглядит следующим образом: new LoadMyContact().execute(rowID);, расположенный в методе onResume.

3.- Зачем пропускать только: (rowID) в качестве аргумента?

delete.execute(new Long[] { rowID }); находится внутри меню, когда подтверждение пользователя удалить контакт мы выполнить это предложение код будет это для удаления (мы внутри на кнопке мыши):

@Override 
      public void onClick(DialogInterface dialog, int button) 
      { 
       final ConectToDataBase databaseConnector = 
        new ConectToDataBase(MySecondClass.this); 


       AsyncTask<Long, Object, Object> deleteTask = 
        new AsyncTask<Long, Object, Object>() 
        { 
        @Override 
        protected Object doInBackground(Long... params) 
        { 
         databaseConnector.deleteContact(params[0]); 
         return null; 
        } 

        @Override 
        protected void onPostExecute(Object result) 
        { 
         finish(); 
         delete.execute(new Long[] { rowID });    
         } 
        }; // end new AsyncTask 
       delete.execute(new Long[] { rowID });    
      }/

Помощь этим три вопрос и спасибо.

+0

В Java, 'Long! = Long' –

ответ

8

AsyncTask имеет вид AsyncTask<Param, Progress, Return> с execute использованием Param типа.

# 1

можно написать execute(null). Это приводит к предупреждению Confusing 'null' argument to var-arg method в IntelliJ IDEA. Это предупреждение отмечает, что оно не завернуто как одноэлементный массив. Поэтому, поскольку Param - Object, в этом случае execute((Object[])null) используется для подавления предупреждения.

Поскольку переменные параметры аргумента не обязательно должны иметь переданное им значение, вместо этого вы можете использовать execute().

# 2 & # 3

В этом случае Param является Long, поэтому выполнить метод имеет форму execute(Long...). Без синтаксического сахара с переменным аргументом это то же самое, что и execute(Long[]). Поэтому new Long[]{ rowId } явно создает массив Long с одним элементом (rowId). Поскольку rowId является long, компилятор Java автоматически «помещает» (обертывает) это целое число в объект Long - эквивалент записи new Long(rowId).

Поскольку метод execute использует переменные аргументы, вам не нужно выделить Long массив непосредственно - компилятор Java будет делать это для вас - так что вы можете просто написать execute(rowId) вместо этого. То есть компилятор Java расширяется execute(rowId) в execute(new Long[]{ new Long(rowId) }).

Следовательно, # 2 и # 3 эквивалентны.

+0

Отличный ответ reece! –

3

Ответ на все вопросы является AsyncTask логика:

При определении AsyncTask, мы должны объявить 3 параметра:

private class MyTask extends AsyncTask<Object, Object, Cursor>

Как и в вашем случае выше, вы дали объект, Объект, Курсор.

Теперь 1-й параметр установлен во время вызова «выполнить» и используется функцией doInBackGround(). Это было разработано как массив определенного типа, чтобы мы могли отправлять несколько данных. Например, мы можем сделать:

myTask.execute(url1, url2, url3) для моего AsysncTask, чей первый параметр - URL. В doInBackGround() функции, мы можем оценить, как URL [0], URL [1], URL [2]

второго параметра в AsyncTask используется onProgressUpdate() функцией и она также рассчитывает получить массив определенного типа.

3-й параметр в AsyncTask используется функцией onPostExecute() и является значением, заданным с помощью функции doInBackGround(). Не обязательно должен быть массив определенного типа.

Не все типы всегда используются асинхронной задачей. Чтобы отметить тип как неиспользованный, просто используйте тип Void:

частный класс MyTask расширяет AsyncTask {...}

Приведенные ниже сведения о ссылке AsyncTask, который ответит на все 3 вопроса твоего:

http://developer.android.com/reference/android/os/AsyncTask.html

+0

ok Спасибо за ответ, высоко оценил – user2580401

+0

хороший ответ, но почему это в формате кода? lol – NightSkyCode

+0

@NightSky .. Я надеюсь, что теперь он выглядит нормально. Спасибо, что указали это. Еще научиться форматировать вещи :) – Sushil