0

Я пытаюсь синхронизировать задачи Google с моим приложением. Для этого я создал класс, в котором я создал все методы, которым необходимо получить списки задач и создать список и т. Д.ArrayIndexOutOfBound exception

Теперь я хочу проверить Если эти методы работают или нет. Для этого я создал класс, который расширяет AsyncTask.

Мне нужно передать некоторые параметры в этой задаче, как в методах, которые у меня есть. Как в getTaskList(Strig listId). Чтобы получить задания из любого списка, мне нужно будет предоставить идентификатор списка.

Теперь, когда я попытался передать параметры в AsyncTask. Призывая его в

result = gTaskSyncer.getTaskList(params[0].toString()); 

его выбрасывания ArrayIndexOutOfBoundException здесь.

TestAsyncTask

public class TestAsyncTask extends AsyncTask<Object,Void,List<Task>>{ 

    private com.google.api.services.tasks.Tasks mService = null; 
    private Exception mLastError = null; 
    private MainActivity activity; 
    private com.google.api.services.tasks.Tasks client = null; 

    public TestAsyncTask(GoogleAccountCredential credential, MainActivity activity) { 
     HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
     JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 
     mService = new com.google.api.services.tasks.Tasks.Builder(
       transport, jsonFactory, credential) 
       .setApplicationName("Google Tasks API Android Quickstart") 
       .build(); 
     this.activity = activity; 
    } 

    protected List<Task> doInBackground(Object... params) { 



     GTaskSyncer gTaskSyncer = new GTaskSyncer(activity); 

     List<Task> result = new ArrayList<>(); 

     try { 

      result = gTaskSyncer.getTaskList(params[0].toString()); 

     } catch (IOException e) { 

      Handler handler = new Handler(Looper.getMainLooper()); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(activity, "No tasks.", Toast.LENGTH_SHORT).show(); 
       } 
      }); 

     } 
     return result; 
    } 


    @Override 
    protected void onPostExecute(List<Task> output) { 
     activity.mProgress.hide(); 
     if (output == null || output.size() == 0) { 
      activity.mOutputText.setText("No results returned."); 
     } else { 
      activity.mOutputText.setText(TextUtils.join("\n", output)); 
     } 
    } 
} 

GTaskSyncer

public class GTaskSyncer 
{ 

    final MainActivity activity; 
    final com.google.api.services.tasks.Tasks mService; 
    private Exception mLastError = null; 



    GTaskSyncer(MainActivity activity) { 
     this.activity = activity; 
     mService = activity.mService; 
    } 

    public List<TaskList> getAllTaskList() throws IOException 
    { 
     List<TaskList> result = new ArrayList<TaskList>(); 

     TaskLists taskLists = mService.tasklists().list().execute(); 

     for (TaskList taskList : taskLists.getItems()) { 

       result.add(taskList); 
     } 

     return result; 

    } 


    public TaskList createList() throws IOException 
    { 

     TaskList taskList = new TaskList(); 

     taskList = activity.mService.tasklists().insert(taskList).execute(); 

     return taskList; 
    } 

    public Task createTask(String listId) throws IOException 
    { 

     Task task = new Task(); 

     task = activity.mService.tasks().insert(listId, task).execute(); 

     return task; 
    } 

    public Task getTask(String listId,String taskId) throws IOException 
    { 

     Task task = activity.mService.tasks().get(listId, taskId).execute(); 

     return task; 
    } 

    public List<Task> getTaskList(String listId) throws IOException { 


     List<Task> result = new ArrayList<Task>(); 

     List<Task> tasks = mService.tasks().list(listId).execute().getItems(); 

     if (tasks != null) { 

      for (Task task : tasks) { 

       result.add(task); 
      } 
     } else { 

      Toast.makeText(activity, "No tasks.", Toast.LENGTH_SHORT).show(); 
     } 

     return result; 

    } 

} 

Кроме того, как я могу проверить это? Как предоставить метод listId методу, когда мы его вызываем?

+0

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

ответ

0

Массив из исключений ограничивающих является исключение Java выброшен из-за тот факт, что программа пытается получить доступ элемент в позиции , который находится за пределом массива, следовательно, слова «Вне границ».

Проблема

result = gTaskSyncer.getTaskList(params[0].toString()); // In here Problem 

Брошенный, чтобы указать, что массив обращались с незаконным индексом. Индекс является либо отрицательным, либо большим или равным размеру .

  • Я предполагаю, что в вашем doInBackground разделе результат незаконна индекс.
+1

, значение которого я должен добавить для проверки? Я хочу, чтобы все задания из какого-то списка. Как я могу передать listId здесь? @IntelliJ Amiya –

+0

сначала проверяет значения 'params [0] .toString()' –

+0

как? @ IntelliJ Amiya –

2

При вызове Execute() на AsyncTask без каких-либо аргументов, что отсутствует аргумент для выполнения() становится пустой() массив списков параметров вdoInBackground() метода AsyncTask в.

Если вы хотите использовать параметры в doInBackground(), вам необходимо передать некоторые параметры через execute(). Если вы хотите удостовериться, что вы не индексируете предыдущий список элементов, переданных в execute, итерации массива vararg arg вместо индексации непосредственно в него, не проверяя его длину.

+0

Да, это правильно. Но что я должен пройти в выполнении, чтобы протестировать метод? Я хочу получить все задания из определенного списка. Я хочу передать listId. Как я могу? @Doug Stevenson –

+0

Вам не нужно ничего пропускать, если вы этого не хотите. Или, может быть, вы просто передаете необходимый список AsyncTask. Это зависит от вас, но вызывающий и задача должны договориться о том, что передается и как его использовать. –

+0

Я хочу передать listId. для получения заданий одного и того же списка. Как я могу указать –

0

Сначала проверьте, что вы передаете значение при вызове класса Asynctask. ArrayIndexOutOfBoundException происходит потому, что вы не проходите, но хотите получить доступ к этому.

Таким образом, перед доступом, что параметр первым проверить, что если размер больше 1.

Смежные вопросы