2017-01-25 40 views
-1

您好我正在嘗試在AsyncTask中獲取Google Play服務廣告ID。
我閱讀Android AsyncTask API文檔和許多stackoverflow答案。我想首先獲得廣告ID,並開始其他流程。 因此,我製作了AdIdAsyncTask以獲取BackgroundThread中的廣告ID並在我的MainActivity中調用。但是我的AsyncTask狀態總是處於RUNNING狀態。 錯在哪裏?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

_Async_意味着_asynchronous_。 'execute()'調用會立即返回,而'onCreate()'中的其餘代碼將繼續運行,而'AsyncTask'在單獨的線程上工作。 –

+0

因此,如何修改我的代碼以獲取廣告ID並執行其他流程? – byrage

+0

爲什麼你在onCreate()中檢查task.getStatus()。equals(AsyncTask.Status.FINISHED) ? 您剛剛在您的onCreate中啓動了AsyncTask,並且您正在立即檢查狀態,它與此無關 – Shaahul

回答

1

你好,你在f奧爾塞關閉的AsyncTask 請使用下面的代碼YOUT的AsyncTask與條件,並要停止調用它在你的活動,它會阻止你的asynk任務運行

/** 
* 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狀態仍處於RUNNING狀態。 – byrage

+0

@byrage 您必須在AsyncTask外面調用forceCancel()方法,無論您想要停止 – Shaahul

+0

@byrage forceCancel()不是AsyncTask中的重寫方法,因此您必須在AsyncTask外強制使用方法 – Shaahul