0

アプリケーションとGoogleタスクを同期しようとしています。このために、タスクリストを取得してリストを作成する必要のあるすべてのメソッドを作成したクラスを作成しました。ArrayIndexOutOfBound例外

これらのメソッドが有効かどうかをテストします。このため、私はAsyncTaskを拡張するクラスを作成しました。

このタスクでは、パラメータを持つメソッドのようにいくつかのパラメータを渡す必要があります。 getTaskList(Strig listId)のように。リストからタスクを取得するには、リストのIDを指定する必要があります。

今、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とインデックス0になっていると思います。 –

答えて

0

よりも大きければ境界例外のうち配列はJavaの例外が原因 にプログラムがアクセスしようとしている事実を投げていることを確認することをアクセスする前に

、配列の範囲外にある位置 にある要素、つまり「範囲外」という単語です。

通報アレイが不正 インデックスにアクセスされたことを示すためにスローさ

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

。インデックスは、負の値、または配列の サイズ以上です。私はあなたのdoInBackgroundセクション結果に想定し

  • は不正なインデックスです。
+1

どのような値をテストに追加する必要がありますか?私はいくつかのリストからすべてのタスクを欲しいです。ここでリストIDをどのように渡すことができますか? @IntelliJ Amiya –

+0

まずparams [0] .toString()の値を確認してください –

+0

どのようにですか? @ IntelliJ Amiya –

2

あなたはAsyncTaskのdoInBackground()方法では空(可変引数)の配列となります)(行方不明の引数は、実行することを、引数なしAsyncTask上)(実行を呼び出すとき。

doInBackground()にパラメータを使用する場合は、​​でパラメータを渡す必要があります。 executeで渡された項目のリストを越えてインデックスを作成しないようにするには、長さをチェックせずに直接インデックスにインデックスを付ける代わりに、vararg arg配列を繰り返します。

+0

はいそうです。しかし、私はこのメソッドをテストするために実行する必要がありますか?私は特定のリストからすべてのタスクを取得したい。私はlistIdを渡したい。どうやって? @Doug Stevenson –

+0

したくない場合は、何も渡す必要はありません。あるいは、AsyncTaskに必要なリストを渡すだけかもしれません。それはあなた次第ですが、発信者とタスクは、何が合格し、どのように使用するかについて合意する必要があります。 –

+0

私はlistIdを渡したいと思います。同じリストのタスクを取得します。 –

0

最初に、Asynctaskクラスを呼び出すときに値を渡していることを確認します。パスしていないのにアクセスしたいので、ArrayIndexOutOfBoundExceptionが発生します。パラメータが第1のサイズは1

関連する問題