至る所に掲載されているので、あくまでも自分のメモ
基本的にデータ量が少ないのでGETメソッドで説明
ちなみに、com.squareup.okhttp3:okhttp:3.12.1 を使っています。
1.基本的な流れ
・スマフォ側で、起動するサーバサイドのサービスの定義と渡す情報の設定
・非同期処理部分(AsyncTask)の記述。
基本部分は一度書けば使いまわし。
大事なのは、onPostExecuteの部分。
この部分にサーバから戻ってきたデータに対する処理を記述する。
この投稿では、データをチェックしたあと、Intentで別のActivity起動している
2. スマフォ側でサーバプログラム起動の準備
オブジェクト作成と、起動サービス、引数の設定非同期処理のHTTPサービスのオブジェクトを作成して実行
Object[] data = new Object[3];
data[0] = getResources().getString(R.string.url_srv_reg_payout);
// 引数を設定する
data[1] =
hdPartsActivity.SqlSelectReciever receiver =
new hdPartsActivity.SqlSelectReciever();
receiver.execute(qq);
3.非同期処理(AsyncTask)を担当する本体部分
private class SqlSelectReciever extends AsyncTask<String, String, String> {public SqlSelectReciever() {
}
@Override
public String doInBackground(String... params) {
// target URL
String urlStr = (String)params[0];
Log.d(TAG, " SqlSelectReciever: " + "sql=" + urlStr);
// Variable of set result texts
//StringBuilder result = new StringBuilder();
String result = "";
//http接続を行うHttpURLConnectionオブジェクトを宣言。finallyで確実に解放するためにtry外で宣言。
HttpURLConnection con = null;
//http接続のレスポンスデータとして取得するInputStreamオブジェクトを宣言。同じくtry外で宣言。
InputStream is = null;
int i = 10;
try {
//URLオブジェクトを生成。
URL url = new URL(urlStr);
//URLオブジェクトからHttpURLConnectionオブジェクトを取得。
con = (HttpURLConnection) url.openConnection();
//http接続メソッドを設定。
con.setRequestMethod("GET");
//接続。
con.connect();
final int status = con.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
// Success HTTP GET method
is = con.getInputStream();
result = is2String(is);
Log.d(TAG, " HTTP connect result=" + result);
is.close();
}else {
Log.d(TAG, "HTTP response error");
}
} catch (MalformedURLException ex) {
ex.printStackTrace();
//} catch (ProtocolException ex) {
//ex.printStackTrace();
Log.d(TAG, "HTTP MalformedURLException");
} catch (IOException ex) {
ex.printStackTrace();
Log.d(TAG, "HTTP IOException");
} finally {
// HttpURLConnectionオブジェクトがnullでないなら解放。
if (con != null) {
Log.d(TAG, "HTTP not null");
con.disconnect();
}
// InputStreamオブジェクトがnullでないなら解放。
if (is != null) {
Log.d(TAG,"HTTP close InputStream");
try {
is.close();
} catch (IOException ex) {
Log.d(TAG,"HTTP close is IOException");
}
}
}
//JSON文字列を返す。
if ( i == 0) {
Log.d(TAG, "HTTP return : error");
return "error";
}else {
//Log.d("doInBackground:return:", result.toString());
//return result.toString();
//Log.d(TAG, "HTTP return : normal");
return result;
}
}
//=================================================
// サーバから戻ってきた戻り値に対する処理
// ここの部分が大事。
// Activityの中で複数の非同期処理をする時もここにを書く。
// 因みに僕は戻り値の最初の情報cntとretuを使って複数対応している。
//=================================================
@Override
public void onPostExecute(String result) {
String[] ret = result.split("\\|"); // Mac \ -> (option + ¥)
int cnt = Integer.parseInt(ret[0]); // 1行目:検索数
int retu = Integer.parseInt(ret[1]); // 1行目:列数
Log.d(TAG, "cnt:retu=" + cnt + ":" + retu);
・
・ ここにいろいろ処理を書く、
・
Intent intent = new Intent(hdPartsActivity.this, SqlGetList2.class);
// intentへ添え字付で値を保持させる
intent.putExtra( "hdkey", hks);
// 返却したい結果ステータスをセットする
setResult( SqlGetList2.RESULT_OK, intent );
//startActivity(new Intent(hdSeibanListActivity.this, SqlGetList2.class));
startActivity(intent);
//Log.d(TAG, " Intent after : startActivity(intent)");
return;
}
/**
* InputStream objectを文字列に変換するmethod。変換文字codeはUTF-8。
*
* @param is 変換対象のInputStreamオブジェクト。
* @return 変換された文字列。
* @throws IOException 変換に失敗した時に発生。
*/
private String is2String(InputStream is) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sb = new StringBuffer();
char[] b = new char[1024];
int line;
while(0 <= (line = reader.read(b))) {
sb.append(b, 0, line);
}
return sb.toString();
}
}
0 件のコメント:
コメントを投稿