2016-03-16 78 views
0

我在将Google Drive API集成到我的Android应用程序时遇到了一些问题。基本上,我试图创建一个文件夹来存储我的错误日志。问题是,偶尔线程会运行,并且该文件夹将不会在文件需要创建时创建,所以应用程序崩溃。我正在考虑如何避免这种情况,并尝试了一些方法,包括在文件夹回调中进行文件夹分配,但都无济于事。我有时很幸运(特别是在调试时,不幸的是),并且文件保存好,但我显然需要解决并发问题。请让我知道是否需要更多的代码上下文。Android上Google Drive API的并发问题

protected void onPause() { 
    // TODO Find the right place for this 
    if (!mDriveLogList.isEmpty()) { 
     // Perform I/O off the UI thread. 
     // TODO Fix to use RxJava 
     new Thread() { 
      @Override 
      public void run() { 
       Timber.i("Starting File Creation"); 
       // write content to DriveContents 
       if (mDriveContents == null) { 
        Timber.e("Drive Contents Were Null"); 

       } else { 
        OutputStream outputStream = mDriveContents.getOutputStream(); 
        Writer writer = new OutputStreamWriter(outputStream); 
        //TODO Clean/Refactor 
        try { 
         writer.write("Status Log For: " + DateHelper.getDate() + "\n"); 
         for (String logEntry : mDriveLogList) { 
          writer.write(logEntry + "\n"); 
         } 
         writer.close(); 
        } catch (IOException e) { 
         Timber.e(e, "Error During Drive Contents Callback"); 
        } 

        MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
          .setTitle(SURVEIL_DROID + " " + DateHelper.getDate()) 
          .setMimeType("text/plain") 
          .setStarred(true).build(); 

        MetadataChangeSet folderSet = new MetadataChangeSet.Builder() 
          .setTitle("SurveilCustomFolder") 
          .build(); 

        Drive.DriveApi.getRootFolder(mGoogleApiClient) 
          .createFolder(mGoogleApiClient, folderSet) 
          .setResultCallback(folderCallback); 

         mDriveFolder = mFolderId.asDriveFolder(); 

         mDriveFolder.createFile(mGoogleApiClient, changeSet, mDriveContents) 
           .setResultCallback(fileCallback); 

        mDriveLogList.clear(); 
       } 
      } 
     }.start(); 

回答

1

你可以使用的CountDownLatch(见https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html),以帮助同步。像

protected void onPause() { 
    // TODO Find the right place for this 
    if (!mDriveLogList.isEmpty()) { 

     // Perform I/O off the UI thread. 
     // TODO Fix to use RxJava 
     new Thread() { 
      @Override 
      public void run() { 
       final protected CountDownLatch connectionLatch = new CountDownLatch(1); 
       protected boolean folderCreated = false;     
       Timber.i("Starting File Creation"); 
       // write content to DriveContents 
       if (mDriveContents == null) { 
        Timber.e("Drive Contents Were Null"); 

       } else { 
        OutputStream outputStream = mDriveContents.getOutputStream(); 
        Writer writer = new OutputStreamWriter(outputStream); 
        //TODO Clean/Refactor 
        try { 
         writer.write("Status Log For: " + DateHelper.getDate() + "\n"); 
         for (String logEntry : mDriveLogList) { 
          writer.write(logEntry + "\n"); 
         } 
         writer.close(); 
        } catch (IOException e) { 
         Timber.e(e, "Error During Drive Contents Callback"); 
        } 

        MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
          .setTitle(SURVEIL_DROID + " " + DateHelper.getDate()) 
          .setMimeType("text/plain") 
          .setStarred(true).build(); 

        MetadataChangeSet folderSet = new MetadataChangeSet.Builder() 
          .setTitle("SurveilCustomFolder") 
          .build(); 

        Drive.DriveApi.getRootFolder(mGoogleApiClient) 
          .createFolder(mGoogleApiClient, folderSet) 
          .setResultCallback(new 
           ResultCallback<DriveFolderResult>() { 
            @Override 
            public void onResult(DriveFolderResult result) { 
             folderCreated = result.getStatus().isSuccess(); 
             connectionLatch.countDown(); // Release latch         
            } 
           }); 
        try { 
         connectionLatch.await() ; 
        } catch (InterruptedException e) {    
         e.printStackTrace(); 
         return; 
        } 
        if (folderCreated) { 
         mDriveFolder = mFolderId.asDriveFolder(); 
         mDriveFolder.createFile(mGoogleApiClient, changeSet, mDriveContents) 
            .setResultCallback(fileCallback);       
         mDriveLogList.clear(); 
        } 
       } 
      } 
     }.start(); 
    } 
} 

应该工作。