2017-01-25 5 views
-1

こんにちは、AsyncTaskでGoogle Playサービス広告IDを取得しようとしています。
私はAndroid AsyncTask APIのドキュメントと多くのstackoverflow Answerを読んでいます。最初に広告IDを取得して、他のプロセスを開始します。 したがって、BackgroundThreadでAds Idを取得し、MainActivityで呼び出すためにAdIdAsyncTaskを作成しました。しかし、私のAsyncTaskステータスは常に実行中です。 何が間違っていますか?AsyncTaskのステータスは常に実行中

MainActivityとAdIdAsyncTask

public class MainActivity extends Activity { 
    private static final String TAG = "DummyActivity"; 
    private final long MEDIA_ID = 292929L; 
    private final String ACCESS_KEY = "xxxx-xxxx-xxxx"; 

    private String adId = null; 

    private AdContext adContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     AdIdAsyncTask task = new AdIdAsyncTask(); 
     task.execute(); 
     Log.d(TAG, "task.getStatus=" + task.getStatus()); 

     if (task.getStatus().equals(AsyncTask.Status.FINISHED)) { 
      // do work 
     } 
    } 

    @Override 
    protected void onDestroy() { 

     super.onDestroy(); 

     Log.i(TAG, "onDestroy"); 
    } 

    public class AdIdAsyncTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 

      Log.d(TAG, "doInBackground"); 
      AdvertisingIdClient.Info idInfo = null; 
      try { 
       idInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext()); 
      } catch (GooglePlayServicesNotAvailableException | GooglePlayServicesRepairableException | IOException e) { 
       Log.e(TAG, "fetch Google Ads is failed. message=" + e.getMessage()); 
      } 

      String advertisingId = null; 
      try { 
       advertisingId = idInfo.getId(); 
      } catch (NullPointerException e) { 
       Log.e(TAG, "adId is null. message=" + e.getMessage()); 
      } 

      adId = advertisingId; 
      cancel(true); 

      Log.i(TAG, "adId=" + advertisingId + ", isCancelled=" + isCancelled()); 

      return null; 
     } 

     @Override 
     protected void onCancelled() { 

      super.onCancelled(); 
      Log.i(TAG, "onCancelled"); 
     } 

     @Override 
     protected void onCancelled(Void aVoid) { 

      super.onCancelled(aVoid); 
      Log.i(TAG, "onCancelled"); 
     } 
    } 
} 

ログイン

D/DummyActivity: task.getStatus=RUNNING 
D/DummyActivity: doInBackground 
I/DummyActivity: adId=xxxx-xxxx-xxxx, isCancelled=true 
I/DummyActivity: onCancelled 
I/DummyActivity: onCancelled 

SdkVersion

compileSdkVersion 25 
minSdkVersion 14 
targetSdkVersion 25 
+0

を実行しているasynkタスクを停止します_Async_は_asynchronous_を意味します。 'execute()'呼び出しは直ちに戻り、 'OnCreate()'の残りのコードは 'AsyncTask'が別のスレッド上で動作している間は実行を続けます。 –

+0

ですから、広告IDを取得して他のプロセスを実行するためのコードを修正するにはどうすればよいですか? – byrage

+0

なぜonCreate()のtask.getStatus()。equals(AsyncTask.Status.FINISHED) をチェックしていますか? あなたはonCreateでAsyncTaskを開始しましたが、ステータスを即座にチェックしています。それは関係ありません。 – Shaahul

答えて

1

こんにちはあなたができるF ORCEはAsyncTask を閉じた状態でyoutはAsyncTaskに次のコードを使用して停止したい場所あなたの活動でそれを呼んでください、それは

/** 
* Check if asynctask is running, if still running cancel it. 
*/ 
public void forceCancel(){ 
    if (getStatus().equals(AsyncTask.Status.RUNNING)) { 
     cancel(true); 
    } 
} 
+0

AsyncTaskクラスにforceCancel()メソッドを追加し、MainActivityのメソッドを呼び出しますが、AsyncTaskステータスはまだ実行中です。 – byrage

+0

@byrage あなたが停止したいところでAsyncTaskの外側でforceCancel()メソッドを呼び出す必要があります – Shaahul

+0

@byrage forceCancel()はAsyncTaskのメソッドをオーバーライドしないため、AsyncTaskの外側にCancel()メソッドを強制する必要があります。 – Shaahul

関連する問題