非同期での読み込みクラスを作りました。JSON,TEXTなど
で前回非同期の読み込みのクラスを作っていたのですが、PHPとの連携などで、POSTなどでデータを送る必要が出た場合に前回作成したものでは対応が出来きれないので、POSTメソッドを使えるように改変しました。
使い方は下記です。
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(0); nameValuePair.add(new BasicNameValuePair("udid", UID)); JsonLoader task = new JsonLoader(nameValuePair); task.setOnCallBack(new CallBackJson(){ @Override public void CallBack(String Result) { Toast.makeText(TopActivity.this, Result, 800).show(); }; }); task.execute(RSS_FEED_URL);
NameValuePairと言うのを作成する必要があります。ここはちょっと面倒だったので、クラス側ではなくこっちで対応させます。
CallBackJsonは前回のを使いまわせます。
package ***; public class CallBackJson { public void CallBack(String Result){ //ここにいろいろ関数をかけばいいと思う。 } }
次にJsonLoaderですが、
package ***; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import android.os.AsyncTask; public class JsonLoader extends AsyncTask<String, Integer, String> { private CallBackJson callbackjson; private String mode = "none"; private List<NameValuePair> _nameValuePair; // コンストラクタ public JsonLoader() { mode = "none"; } public JsonLoader(List<NameValuePair> nameValuePair) { mode = "post"; _nameValuePair = nameValuePair; } @Override protected void onPreExecute() {} @Override protected String doInBackground(String... params) { if(mode.equals("post")){ return getDataPost(params[0]); }else{ return getData(params[0]); } } public void setOnCallBack(CallBackJson _cbj){ callbackjson = _cbj; } @Override protected void onPostExecute(String result) { callbackjson.CallBack(result); } public String getData(String _url) { DefaultHttpClient objHttp = new DefaultHttpClient(); HttpParams params = objHttp.getParams(); HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 3000); String _return = ""; try { HttpGet objGet = new HttpGet(_url); HttpResponse objResponse = objHttp.execute(objGet); if (objResponse.getStatusLine().getStatusCode() < 400){ InputStream objStream = objResponse.getEntity().getContent(); InputStreamReader objReader = new InputStreamReader(objStream); BufferedReader objBuf = new BufferedReader(objReader); StringBuilder objJson = new StringBuilder(); String sLine; while((sLine = objBuf.readLine()) != null){ objJson.append(sLine); } _return = objJson.toString(); objStream.close(); } } catch (IOException e) { return ""; } return _return; } public String getDataPost(String sUrl) { String sReturn = ""; DefaultHttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(sUrl); try{ httppost.setEntity(new UrlEncodedFormEntity(_nameValuePair)); HttpResponse response = httpclient.execute(httppost); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); response.getEntity().writeTo(byteArrayOutputStream); if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ sReturn = byteArrayOutputStream.toString(); }else{ return ""; } }catch (UnsupportedEncodingException e){ return ""; }catch (IOException e){ return ""; } return sReturn; } }
他の言語(actionscript)をやってた関係で、ちょっとJAVAは引数のタイプかえるだけで実行するコンストラクタを帰られるのがすごい便利だなーと思うのですが、こんな感じでPOSTに対応のJSONLoaderが完成しました。
POSTしたいものを増やすときには
nameValuePair.add(new BasicNameValuePair("udid1", UID1)); nameValuePair.add(new BasicNameValuePair("udid2", UID2)); nameValuePair.add(new BasicNameValuePair("udid3", UID3));
こんな感じで、addで増やしてください。
ずいぶん前に拾った方法でやっていたので参照元がわからなくなってしまいました。すいません。
ちょっと読み込み方が違うので、(両方とも同じ事なんですが)楽しいかもしれないので(基本違う必要があるのはheader部分のみなので)見比べるのも楽しいかもしれないです。
■追記
callbackjson = null;
をonPostExcuteの中に入れてメモリを解放してあげる必要がありました。
■追記
postもtimeoutに対応するには、
HttpParams params = httpclient.getParams(); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params, 5000);
を追加すればよいようです。