Java 如何处理IOException?

Java 如何处理IOException?,java,android,ioexception,google-tasks-api,google-tasks,Java,Android,Ioexception,Google Tasks Api,Google Tasks,我正在尝试在我的应用程序中同步google任务。我创建了一个类来处理用于获取任务列表和所有任务相关方法的方法 我想在UI中调用这些方法 出于测试目的,我创建了一个类,该类扩展了AsyncTask,在本文中,我调用了getTaskList的方法。但是它抛出了一个异常,我认为我用了一种错误的方式处理它 我想知道getTaskList方法提供的参数是listId。它应该返回指定id列表中的所有任务 现在,我应该如何通过list的Id来测试它是否返回了所有任务 目前,我得到的错误如下: FATA

我正在尝试在我的应用程序中同步google任务。我创建了一个类来处理用于获取任务列表和所有任务相关方法的方法

我想在UI中调用这些方法

出于测试目的,我创建了一个类,该类扩展了AsyncTask,在本文中,我调用了getTaskList的方法。但是它抛出了一个异常,我认为我用了一种错误的方式处理它

我想知道getTaskList方法提供的参数是listId。它应该返回指定id列表中的所有任务

现在,我应该如何通过list的Id来测试它是否返回了所有任务

目前,我得到的错误如下:

    FATAL EXCEPTION: AsyncTask #1
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime: Process: com.example.siddhi.taskdemo, PID: 15993
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java:304)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:  Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.os.Handler.<init>(Handler.java:200)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.os.Handler.<init>(Handler.java:114)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.widget.Toast$TN.<init>(Toast.java:344)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.widget.Toast.<init>(Toast.java:100)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.widget.Toast.makeText(Toast.java:258)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at com.example.siddhi.taskdemo.TestAsyncTask.doInBackground(TestAsyncTask.java:54)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at com.example.siddhi.taskdemo.TestAsyncTask.doInBackground(TestAsyncTask.java:25)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
03-30 21:21:10.593 15993-16025/com.example.siddhi.taskdemo E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 
测试同步任务

  public class TestAsyncTask extends AsyncTask<Void, 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(Void... params) {

        GTaskSyncer gTaskSyncer = new GTaskSyncer(activity);

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

        try {

            result = gTaskSyncer.getTaskList("Bdjxxuj");

        } catch (IOException e) {

            Toast.makeText(activity,"IO Exception",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));
        }
    }
}
公共类TestAsyncTask扩展了AsyncTask{
private com.google.api.services.tasks.tasks mService=null;
私有异常mLastError=null;
私人活动;
private com.google.api.services.tasks.tasks客户端=null;
公共TestAsyncTask(GoogleAccountCredential凭证,Main活动){
HttpTransport-transport=AndroidHttp.newCompatibleTransport();
JsonFactory JsonFactory=JacksonFactory.getDefaultInstance();
mService=new com.google.api.services.tasks.tasks.Builder(
运输、jsonFactory、凭证)
.setApplicationName(“谷歌任务API Android快速启动”)
.build();
这个。活动=活动;
}
受保护列表doInBackground(无效…参数){
GTaskSyncer GTaskSyncer=新的GTaskSyncer(活动);
列表结果=新建ArrayList();
试一试{
结果=gTaskSyncer.getTaskList(“Bdjxxuj”);
}捕获(IOE异常){
Toast.makeText(活动,“IO异常”,Toast.LENGTH_SHORT).show();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(列表输出){
activity.mProgress.hide();
if(output==null | | output.size()==0){
activity.mouttext.setText(“未返回结果”);
}否则{
activity.mouttext.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;
    }

}
公共类GTaskSyncer
{
最后的主要活动;
最终com.google.api.services.tasks.tasks mService;
私有异常mLastError=null;
GTaskSyncer(主要活动){
这个。活动=活动;
mService=activity.mService;
}
public List getAllTaskList()引发IOException
{
列表结果=新建ArrayList();
TaskLists TaskLists=mService.TaskLists().list().execute();
对于(任务列表任务列表:taskLists.getItems()){
结果.添加(任务列表);
}
返回结果;
}
public TaskList createList()引发IOException
{
TaskList TaskList=新任务列表();
taskList=activity.mService.tasklists().insert(taskList.execute();
返回任务列表;
}
公共任务createTask(字符串listId)引发IOException
{
任务=新任务();
task=activity.mService.tasks().insert(listId,task.execute();
返回任务;
}
公共任务getTask(String listId,String taskId)引发IOException
{
Task Task=activity.mService.tasks().get(listId,taskId.execute();
返回任务;
}
公共列表getTaskList(字符串listId)引发IOException{
列表结果=新建ArrayList();
List tasks=mService.tasks().List(listId.execute().getItems();
如果(任务!=null){
for(任务:任务){
结果。添加(任务);
}
}否则{
Toast.makeText(活动,“无任务”,Toast.LENGTH_SHORT).show();
}
返回结果;
}
}

请帮助..

您不能在后台线程中显示祝酒词

使用以下命令:

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

您不应该从UI线程以外的线程调用UI方法。至于如何处理异常,这是您的业务需求,因此我们在这方面无能为力。@StephenC,他收到了一个IOException,但捕获了异常并在工作线程中干杯。明白了。但是如果它返回所有任务,我如何通过listId和测试呢@ExaqtI不熟悉您正在使用的Google服务任务。也许您可以将id设置为类中的成员。像私有字符串id;然后在您的doInBackground中:this.id=“Bdjxxuj”;
   Handler handler = new Handler(Looper.getMainLooper());
   handler.post(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(activity, "No tasks.", Toast.LENGTH_SHORT).show();
        }
    });