2019年8月2日金曜日

Android 非同期処理でサーバサービスを利用する

スマフォからデータベース処理する方法のメモ
至る所に掲載されているので、あくまでも自分のメモ

基本的にデータ量が少ないので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();
        }
    }

Peace!!

0 件のコメント:

コメントを投稿