2014-10-16 92 views
0

我有一個AsyncTask,我想在此類的 字段中存儲一些信息。我有這樣的事情:AsynTask字段爲空

public class NFCReaderTask extends AsyncTask<Void, Void, Void> { 
    private String Year = null; 
    private String Month = null; 
    private String Day = null; 

    @Override 
    protected void onPreExecute() { 
     // do some stuff 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // do some stuff 
    } 

    @Override 
    protected void onPostExecute(final Void unused) { 
     // do some stuff 
     // here my fields are filled with all informations 

     log.v("This First", "" + getYear()); 
    } 

    public String getYear() { 
     return Year; 
    } 
    public String getMonth() { 
     return Month; 
    } 
    public String getDay() { 
     return Day; 
    } 
} 

在我的活動我這樣做:

public void resolveIntent(Intent intent) { 
    // ... 

    NFCReaderTask startReaderTask = new NFCReaderTask(dataDevice); 
    startReaderTask.execute(); 
    startReaderTask.get(); 

    log.v("This Second", "" + startReaderTask.getYear()); // but this is printed out first 

    // ... 
} 

但值均爲空。爲什麼我的字段在我的onPostExecute方法的最後幾行填充了信息 ,但在AsyncTask的.execute() 之後爲空?

編輯:

我加了一些日誌輸出,並注意到了,從我的活動 日誌輸出我的AsyncTask的日誌輸出之前打印出來。這是否意味着 AsyncTask#get()不起作用?

+1

你不應該使用get,因爲它會等待線程完成執行。您還應該1000%不使用您接受的答案,即運行一個while循環,直到AsyncTask停止運行以延遲執行代碼。你應該使用回調。請參閱下面的答案。 – Rarw 2014-10-16 18:06:51

+1

你也不需要也不應該使用getter方法。 AsyncTask異步運行,這意味着它不遵循正常代碼的流程。你不知道什麼時候會回覆答案。因此,獲得者是不合適的,因爲當你打電話給他們時,很可能沒有價值。使用僅在任務完成時觸發的回調/接口解決了這個問題。 – Rarw 2014-10-16 18:32:06

回答

0

它們爲空,因爲至少在提供的代碼中,您從不提供它們的值。您需要使用setter方法設置執行前的年,月和日值,或者需要在execute()方法中提供數據作爲參數並檢索參數。例如:

@Override 
protected Void doInBackground(String...params){ 
    String year = params[0]; 
    String month = params[1]; 
    String day = params[2]; 
} 

如果你的問題是,你是不是從AsyncTask返回值,這是因爲AsyncTask並不像一個正常的方法返回值。作爲一般規則,您不應該使用get()方法來獲取值。相反,請在AsyncTask中定義一個接口,並使用它來回調您的起始活動或片段以及結果。例如:

public interface ReaderTaskCallback{ 
    public void onTaskComplete(String year, String month, String day); 
} 

設置界面,當你加入一個setCallback方法

//In your AsyncTask 
private ReaderTaskCallback mCallback; 

public void setCallback(ReaderTaskCallback callback){ 
    mCallback = callback; 
} 

//In your activity 
NFCReaderTask startReaderTask = new NFCReaderTask(dataDevice); 
startReaderTask.setCallback(new ReaderTaskCallback(){ 

    @Override 
    public void onTaskComplete(String year, String month, String day){ 
     //use results 
    } 

}); 

要得到的結果從任務回來只是調用回調方法時,你的任務是這樣完成創建AsyncTask

mCallback.onTaskComplete(year, month, day); 

這些值在準備好後會被傳回給您的活動或片段。

+0

問題是我不能在doInBackground中設置值。我必須在onPostExecute中設置它們,所以我不能調用AsyncTask#wait()。 – Mulgard 2014-10-16 18:13:17

+0

你可以調用onPreExecute()中的get方法,或者你可以爲asyncTask創建一個構造函數。你也可以在執行時傳遞一個高級對象,將你的asyncTask改爲 danny117 2014-10-16 18:21:18

+0

你是什麼意思,你必須在onPostExecute中設置它們?我很困惑。如果您的意思是在任務完成onDoInBackground之前您沒有這些值,那麼您應該使用我的方法並在您的onPostExecute中調用回調方法。在後臺執行工作,將結果返回到onPostExecute或設置該任務的成員值,然後調用回調函數onPostExecute將值返回給您的活動。 – Rarw 2014-10-16 18:29:12

0

你不能從任何地方通過任何日期參數,如果你這樣做,你還願意再需要一個構造函數添加到您的NFCReaderTask類...

public NFCReaderTask(String year, String month, String day) { 
    Year = year; 
    Month = month; 
    Day = day; 
} 

設定日期參數的任務,例如如:

new NFCReaderTask("2014", "10", "16").execute(); 

順便說一句,如果您的日期值是整數,你不需要沿着將它們作爲字符串:

new NFCReaderTask(2014, 10, 16).execute();