私はScala/Play(サーバー側)を学び、Android(クライアント)ゲーム開発を覚えて、開発を盛り上げることに決めました。
私はAndroidでHTTPリクエストのための素敵なデザインをする方法に関する質問があります。
私が最もよく理解しているところは、抽象的なクラスAsyncTask
を拡張してHTTPリクエストを委譲することです。
オーバーライドするdoInBackground
メソッドで異なるロジックごとにAsyncTask
の新しい拡張を行う必要がありますか?
私にとっては、それぞれのリクエストロジックにクラスを持たせるのは自然ではありませんが、むしろ1つのクラスにいくつかの一貫したメソッドをカプセル化しています。Android AsyncTaskクラスをモデリングする方法は?
私はちょっと遊び始めましたが、私はデザインに満足していません。私は、doInBackground(Object... params)
のvarargsオブジェクトのデザインが嫌いです。
このデザインでは、型の安全性が失われ、paramsオブジェクトは直感的で直感的ではありません。私のコードでは何かを追求しています。
ここでは改善したいコードを示します。
public class GameActivity extends Activity {
private class MyCellListener implements ICellListener {
public void onCellSelected() {
ServerProxy.postSelectedCell(row, col, player.getUser());
...
// ServerProxy.other();
public class ServerProxy extends AsyncTask<Object, Void, Void>{
private static final String TAG = ServerProxy.class.getSimpleName();
private static final String SERVER_ADDRESS = "http://127.0.0.1";
// Prevent external instantiation
private ServerProxy(){};
public static void postSelectedCell(int row, int cell, User user){
List<NameValuePair> postParameters = new ArrayList<NameValuePair>(3);
postParameters.add(new BasicNameValuePair("row", String.valueOf(row)));
postParameters.add(new BasicNameValuePair("cell", String.valueOf(cell)));
postParameters.add(new BasicNameValuePair("userName", user.getUserName()));
new ServerProxy().doInBackground("setSelectedCell" , postParameters);
}
// public static void postOther() {
// new ServerProxy().doInBackground("other" , //some parameters);
// }
/**
* @param postParameters First object URL postfix<br/>
* Second parameter is post parameters inform of {@code List<NameValuePair>}
* @return null
*/
@SuppressWarnings("unchecked")
@Override
protected Void doInBackground(Object... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(SERVER_ADDRESS +"/" + params[0]);
httppost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
try {
httppost.setEntity(new UrlEncodedFormEntity((List<NameValuePair>) params[1]));
httpclient.execute(httppost);
} catch (ClientProtocolException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
return null;
}
}
私はあなたの答えを感謝しますが、あなたは私のコード/質問を誤解していると思います。 2回の往復をすると2つのインスタンスが必要だと書いています。私はすべての私のパブリックメソッド呼び出しが新しいServerProxy()で新しいインスタンスをインスタンス化するので、それを持っています。あなたのコードがうまくいくように私が間違っていれば私を修正してください。しかし、私の問題を全く解決していないのですか?問題は1つのクラスで多くの異なる種類の要求を持つことでした。たとえば、単一のServerクラス、何らかの方法でAsyncTaskを拡張し、多くのメソッドpostFirstName、postLastName、getAllFriendsなどをすべて一意のパラメータで保持します。 – Farmor
AyncTaskの目的を理解していないと思うので、AyncTaskが実際に行うことをよりよく説明するために私の答えを更新しました。 – chubbsondubs