我正在尝试将google任务与我的应用程序同步。为此,我创建了一个类,在其中我创建了所有需要获取任务列表和创建列表等的方法。
现在我想测试这些方法是否有效。为此,我创建了一个扩展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 :(得分:2)
当你在没有任何参数的AsyncTask
上调用execute()时,execute()的缺少参数在 AsyncTask的 doInBackground()
方法中变为空(varargs)数组
如果您希望能够使用doInBackground()
中的参数,则必须通过execute()
传递一些参数。如果你想确保不索引执行中传递的项目列表,请迭代vararg arg数组而不是直接索引到它而不检查其长度。
答案 1 :(得分:0)
首先检查一下,在调用Asynctask类时传递值。 ArrayIndexOutOfBoundException
发生是因为您没有通过但想要访问它。
因此,在访问该参数之前,首先检查大小是否大于1.
答案 2 :(得分:0)
数组越界异常是由于引发的Java异常 程序试图访问某个位置的元素这一事实 超出数组限制,因此单词&#34;超出范围&#34;。
<强>问题强>
result = gTaskSyncer.getTaskList(params[0].toString()); // In here Problem
抛出表示已使用非法访问数组 指数。该指数为负数或大于或等于 数组的大小。
doInBackground
部分结果是非法索引。