2015-11-15 55 views
0

我的實際問題是朝向頁面底部,並且可能不需要您查看我的所有代碼。在Android中使用命令模式並結合Http請求處理程序處理其結果

所以我想我想在我的Android應用程序中使用命令模式。我有一個類HttpRequestHandler其中extends AsyncTask,因此有doInBackgroundonPostExecute方法。 HttpRequestHandler接受一個URL和一個HttpRequest類型作爲參數。

我想要做的是將一個方法(以接口的形式)傳遞給HttpRequestHandler,以便在onPostExecute中我可以調用該方法並讓它顯示從給定textview中的Http請求獲得的結果。這樣我就不必在我的onPostExecute

中使用巨大的switch(case),但我需要一些幫助來執行。在這種情況下,我有兩個獨立的類實現Command。

public interface Command{ 
    public void execute(JSONObject json); 
} 

public class DisplayResult implements Command{ 

    public TextView textview; 

    public DisplayResult(TextView textview){ 
     this.textview = textview; 
    } 
    @Override 
    public void execute(JSONObject output){ 
     textview.setText(output.getString("mystring") 
    } 
} 

public class ConfirmPost implements Command{ 

    public ConfirmPost(){ 
    } 
    @Override 
    public void execute(JSONObject output){ 
     Log.d("Success! ","POST successfull"); 
    } 
} 

而且兩次調用HTTPRequestHandler,一個傳遞DisplayResult和一個傳遞ConfirmPost類。 公共靜態無效

TextView mytextview = (TextView) findViewById(R.id.mytextview); 
new HttpRequestHandler(new DisplayResult(mytextview)).execute("myurl","GET"); 

new HttpRequestHandler(new ConfirmPost()).execute("myurl","POST"); 

現在,它在我的HttpRequestHandler在那裏我遇到的問題。

public class HttpRequestHandler extends AsyncTask<String, String, String>{ 
Command presenter; 

    Public HttpRequestHandler(Object presenter){  
     this.presenter = (Command) presenter; 
    } 

    Public String doInBackground(String... uri){ 
     ... 
    } 

    Public onPostExecute(String result){ 
     presentation = new JSONObject(result); 
     presenter.execute(); 
    } 

使用對象作爲參數類型在我看來,只是感覺,不是最佳實踐。我從來沒有見過任何人像這樣使用它,並且必須拋出給定對象爲Command的想法揉搓我錯誤的方式。有沒有什麼辦法,我可以讓類的信任,我給它一個Command對象?

這是我第一次使用命令模式,但我還沒有完全理解它。要溫柔。

UPDATE

它看起來像我想在這裏使用泛型。儘管如此,我仍然不知道如何以最佳實踐的方式執行該操作。我現在擁有的是:

Command presenter; 

public <Command> HttpRequestHandler(Command presenter){ 
    this.presenter = (com.example.myproject.Command) presenter; 
    //ugly! 
} 

而且我似乎可以通過它的任何舊的實現的Command這工作得很好,我似乎無法在網上找到的任何引用具有相同的語法和功能。我聽過一些關於工廠模式的提及,但我有一種感覺,Command Pattern不依賴於另一種模式來完成這種功能。任何方向將不勝感激。

+0

最後的「溫柔」部分顯示了初學者在SO上有多少人害怕提出可能有意義的問題,這是因爲一些熱衷於獲得良好聲譽但沒有禮貌的人。這是一個信號傢伙。 「溫柔」 – therealprashant

+0

我剛纔問了很多看似無關緊要的問題,但關於編程只是爲了真正愚蠢的東西而遭到嚴厲斥責。 – Csteele5

回答

0

確實這是一個泛型的問題。 Using Bounded Type Parameters並且通過具有T延長Command,我可以保證我的參數將會是Command

HttpRequestHandler一個子類(在這種情況下實現)現在應該是這個樣子

public class HttpRequestHandler extends AsyncTask<String, String, String>{ 

    Command presenter; 

    public <T extends Command> HttpRequestHandler(T presenter){ 
     this.presenter = presenter; 
    } 

    presenter.execute("Success!"); 
} 

不可怕鑄造必要的。