2015-11-05 52 views
2

如果我在之內調用方法,有什麼區別AsyncTask [1] vs如果我直接在它寫代碼[2]?如果我在AsyncTask內編寫我的所有代碼,那麼它確實很混亂。我想創建單獨的方法來做到這一點,甚至可能是單獨的類。在AsyncTask中調用方法?

[1]:

public class MyAsyncTask extends AsyncTask < Void, Void, String > { 
    @Override 
    protected String doInBackground(Void...params) { 
    loadXML(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
    setValues(); 
    } 
} 

public void loadXML() { 
    //loadsXML 
} 
public void setValues() { 
    //Sets values to textViews 
} 

[2]:

public class MyAsyncTask extends AsyncTask < Void, Void, String > { 
    @Override 
    protected String doInBackground(Void...params) { 
    //Load XML from web 
    } 
    @Override 
    protected void onPostExecute(String result) { 
    //Set TextView from result obtained in doInBackground 
    } 
} 
+0

它沒有問題。你有問題嗎? – codeMagic

+0

我還沒有測試過,我只想知道AsyncTask是否可以以這種方式使用,然後再將我的混亂變爲方法。 :D –

+2

好的,你有我的許可。繼續... – codeMagic

回答

0

它本身沒有任何問題,但請記住方法仍在AsyncTask的線程上運行。所以,如果你想修改UI線程,例如你仍然應該使用publishProgress/onProgressUpdate(這意味着你需要對AsyncTask實例的引用)。

+0

因此,如果我調用一個方法:'保護無效onPostExecute(字符串結果){/ /這裏}'這將setText爲textView它不會工作? –

+0

沒有,那會很好。我的意思是執行期間。 (例如,如果您需要從'loadXML()'訪問UI線程) –

0

There's沒有性差異,因爲該代碼將在相同的線程中運行。感覺寫如你所願。

0

沒有什麼區別,但是......

使用[1]接近程序變得更加模塊化,並遵循面向對象的原則。

使用[2]方法,如果您想在其中添加更多方法,它會變得更加笨拙。

和第三種方法[3],我個人可能更喜歡做的是,以暴露單獨的類的方法loadXML()XMLLoader以封裝XML解析和裝載的複雜性,使用這個類在AsyncTask加載XML。

類似的setValues()可能會暴露在我的android活動視圖中,應該傳遞給AsyncTask作爲參數。

請注意,還有其他方式可以模塊化方式解決此問題。

+0

謝謝您的回答!我使用了一個獨立的類,並將AsyncTask放入其中。然後我從我的MainAcitvity這樣調用這個AsyncTask: 'AnotherClass.MyAsyncTask.execute();'。它給了我一個錯誤,說非靜態方法不能從靜態上下文中引用。 –

相關問題