2013-05-04 44 views
1

我想創建一個通用的AsynceTask類,我的所有活動都使用/共享從URL下載內容。出於這個原因,我不希望OnPostExecute除了將內容發送回調用AsyncTask類的活動中的某個方法以外,不做其他任何事情。如何使用上下文訪問/操作另一個類/活動

我知道我需要創建一個構造函數來設置調用AsyncTask的Activity的上下文,但接下來是什麼,我該如何使用上下文來發回與該上下文相對應的活動。我沒有看到教程展示如何以這種方式使用上下文。

可以說我有:

public class LoginActivity { 

    public int ActivityMember; 

    public void HandleButtonClick(void){ 
     DownloadFromURL task = new DownloadFromURL(this); 
     task.execute(url); 
    } 

    public void HandleLoginResult(int x){ 
     ActivityMember = x; 
    } 
} 

現在在一個單獨的Java文件,我有:

private class DownloadFromURL extends AsyncTask<List<NameValuePair>, Long, JSONObject> { 
Context context; 

    public void DownloadFromURL (Context context){ 
     this.context = context; 
    } 

    @Override 
    protected void onPostExecute(JSONObject json) { 
     context.(<- *my question involves this part of code) 
    } 
} 

我敢肯定,我不能叫context.ActivityMember,或context.HandleLoginResult(y)onPostExecute,因爲上下文不是類型LoginActivity,它的一個上下文。 那麼,如何使用它的上下文訪問屬於LoginActivity的成員或方法?

回答

2

可以使用((ActivityName)contextName).methodName()

但它不是一個很好的解決方案。你可以嘗試像this

+0

正是我在找的答案,謝謝。 – Siavash 2013-05-04 07:59:42

+1

鏈接已經死了 – John 2014-03-27 03:53:38

0

容易做到,你只需在你的活動中創建一個方法,並從你通過AsyncTask父類構造函數傳遞的實例中調用它。

假設你在你的活動有一些這樣的:

public void Foo(ArrayList<DataType> data) 
{ 
//Do some with data 
} 

你再調用從onPostExecute這種方法是這樣的:

@Override 
     protected void onPostExecute(ArrayList<DataType> data) 
     { 
       activity.Foo(data); 
     } 

凡活動是通過構造函數傳遞的實例。 乾杯

+0

雖然這可以起作用,但它需要AsyncTask準確地知道它的父類是哪個類,從而使其成爲非通用解決方案。 – Machinarius 2013-05-04 06:59:21

+0

的確如此,但是看在上帝的份上,我只是簡單地指出它,爲了簡單起見,我指出了這個解決方案,因爲扣除你所說的話很容易 – Daniel 2013-05-04 07:03:35

1

將您的活動名稱和上下文傳遞給異步類。

protected void onPostExecute(SoapObject result) 
    { 

      if(classname.equals("LoginActivity")) 
      { 
       ((LoginActivity) object).method(); 
      } 
        else if(classname.equals("MainActivity")) 
      { 
       ((MainActivity) object).method(); 
      } 


} 
+0

這是一個壞主意!從長遠來看,維護噩夢,更不用說如何看起來醜陋級聯。 – Machinarius 2013-05-04 06:56:09

+0

你會推薦什麼解決方案? – Siavash 2013-05-04 07:52:37

+0

面向未來的應用程序需要類似我的解決方案。如果你真的想要快速和骯髒的交易在編碼速度的可維護性,去與此。 – Machinarius 2013-05-07 02:43:04

0

這涉及基本的面向對象編程知識。

如果仔細看http://developer.android.com/reference/android/app/Activity.html,您可以看到Activity extends Context,這就是爲什麼您可以通過將this傳遞給AsyncTask構造函數並使編譯器執行所需的對象切片來擺脫原因。我們可以利用這個優點:創建一個擴展Activity的抽象類(比方說:DataActivity,只是一個例子,儘管命名它),然後在其上編寫一個名爲onDataDownloadComplete(JSONObject json)(回調)的方法,會打電話給你的AsyncTask的onPostExecute。讓所有活動都從DataActivity擴展並實現該方法。將AsyncTask上下文從上下文更改爲DataActivity,以便您可以調用onDataDownloadComplete回調並完成。同樣,由於DataActivity將擴展Activity和Activity擴展了Context,DataActivity或Anyhting,所以它將成爲AsyncTask的有效上下文。

希望你覺得這個有用。

0

我意識到還有另一種方式來實現我正在嘗試做的事情。這帶走了Asyncrony,但登錄的情況下,其實我想的UI是不活動的,而應用程序改掉登錄。

我打電話

asyncTask.execute() 

後,我可以叫

asyncTask.get() 

這將檢索doInBackground的結果並允許您在現場運行它。或者我可以使用超時,所以我不會永遠阻止:

asynceTask.get(5000, TimeUnit.MILLISECONDS) 
相關問題