0

こんにちは、これはテキストファイルを取得するために私がやろうとしていることです.私は同じことを試しました

  • 新しいスレッド

また、新しいスレッドを作成すると、getfiles(Drive services) メソッド内にのみ入ってきません。これが得られない解決策を教えてください。

main でエラーが実行され、デッドロックが発生する可能性があります

public class MainActivity extends Activity {

  static final int REQUEST_ACCOUNT_PICKER = 1;


  private static Uri fileUri;
  private static Drive service;
  private GoogleAccountCredential credential;
  Button b;

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button)findViewById(R.id.b1);

    credential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE);
    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);

    Toast.makeText(getApplicationContext(), "case1", Toast.LENGTH_LONG).show();

}

 protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) 
 {

     if(requestCode==REQUEST_ACCOUNT_PICKER)
     {
         if (resultCode == RESULT_OK && data != null && data.getExtras() != null)
         {
             Toast.makeText(getApplicationContext(), "case2", Toast.LENGTH_LONG).show();

                String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                if (accountName != null)
                {
                  credential.setSelectedAccountName(accountName);
                  service = getDriveService(credential);

                  Toast.makeText(getApplicationContext(), "Got the E mail id", Toast.LENGTH_LONG).show();
             b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getApplicationContext(), "case4", Toast.LENGTH_LONG).show();

                    getfiles(service);

                }
              });
          }
        }
     }


 }

 public void getfiles(final Drive service)
 {



     Toast.makeText(getApplicationContext(), "case5", Toast.LENGTH_LONG).show();
     String TEXT_PLAIN = "TEXT/PLAIN";
     try
     {
     Files.List request = service.files().list().setQ("mimeType = '" + TEXT_PLAIN +"'");
     Toast.makeText(getApplicationContext(), "case", Toast.LENGTH_LONG).show();                 
     Map<String, File> textFiles = new HashMap<String, File>();

            do {

                  Toast.makeText(getApplicationContext(), "case6", Toast.LENGTH_LONG).show();

                FileList files = request.execute();  //this is error line


                Toast.makeText(getApplicationContext(), "case7", Toast.LENGTH_LONG).show();
                for (File file : files.getItems())
                {
                  textFiles.put(file.getId(), file);
                }
                request.setPageToken(files.getNextPageToken());

            } while (request.getPageToken() != null && request.getPageToken().length() > 0);

     }
     catch(Exception e)
     {
         Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show();
     }



 }


 private Drive getDriveService(GoogleAccountCredential credential) {
        return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential)
            .build();
      }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

4

1 に答える 1

0

I/O やネットワーク アクティビティなど、時間がかかるコードは別のスレッドで実行する必要があります。あなたの状況では、ファイルの取得は ASyncTask 内で行うのが最適です。

この警告の理由は、ドライブからファイルを取得するためにコードが実行されている場合、ファイルの取得が完了するまでコードがブロックされるためです。これは、プログラム内の他の何も応答できないこと、つまり GUI が更新されないことを意味します。 GUI を操作しようとするユーザーからの入力は登録されません。数秒経ってもファイルの取得がまだ完了していない場合は、ユーザーに ANR (Application Not Responding) メッセージが表示されます。これにより、ユーザーは、患者の場合は待機するか、アプリを強制終了するかのいずれかを選択できます。

于 2013-08-23T09:25:50.337 に答える