AndroidでPost送信を行うには…安全&簡単なやり方【Java】

数年前までアプリ開発してたんですが、とある事情でやめてました。

でも作りたいアプリがあったので、最近になって再開してます。

ただ辞めている間にAndroid Studio が出るは、いつのまにか Android がお菓子のコード名をやめたとか、次はAndroid10になるだとか・・・いろいろ状況が変わりすぎて浦島太郎状態

そこで新規一転、Android開発で学んだことをメモしてきます。
(このブログらしくWeb開発と関係のあること中心)

 

今回は Android でPOST送信してレスポンスを受け取る方法 について

非同期処理はメインスレッドに書いてはいけないので、
AsyncTask を使って非同期通信しないとダメになったみたいです。

Android6.0以降だと AsycnTask が必須みたい

AsyncTaskは文字通り非同期なタスクを実行するためのもの

POST送信とか通信系の処理は、Android6.0以降だと必ずこれを使わないとダメみたいです

昔はUIスレッド上でも行けた気がするけど、大分状況が変わってますね。

▼ ちなみに AsyncTask  の公式リファレンスでの説明

AsyncTask enables proper and easy use of the UI thread. This class allows you to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

引用元 : https://developer.android.com/reference/android/os/AsyncTask

▼ 上の説明の超意訳

AsyncTaskを使うと、UIスレッドを安全&簡単に使用できる。つまり、面倒なスレッドやハンドラーの操作しないでUIスレッドに結果を反映できるし、バックグラウンド操作も実行できるってこと。

この AsyncTask  を使うことで、安全にPOST送信できます。

自分がよく試すのは、次で紹介する手順 です。

手順1.まずPOST送信用のデータクラスを作成

まずPOST送信しやすくするための準備から

それがPOST送信のURL・データを一括管理できるクラスの作成

別になくてもいいけど、コードを再利用しやすくなります。

 

ここでは SendPostTaskParams  という名前で作成してみました。

▼ 実際に作ってみたクラスコード例がコチラ

POST送信するデータは postData  で連想配列として宣言。
あとPOST通信してレスポンスを返してもらうURLを url  で定義。

その他に必要なパラメーターがあるなら、色々追加してもOK

それにしても、こうやって Java でコード書くのも久しぶりです。
大分忘れてることもあって、クラス作るだけでもしんどかった・・・笑

まあとりあえず、こういうクラスを定義しておきます。

手順2.POST送信するAsyncTaskクラスを作成する

次に肝心のAsyncTaskクラスの作成

ここでは SendPostAsyncTask  というクラス名で作ってみます。

 

▼ そのコード例は次の通り

長い・・・・・・・・・・
POST送信でこれだけ長くなるなんて アプリ開発 って大変です。

それで大事なポイントだけ箇条書きすると、こんな感じ

  • 必ず doInBackgroud  をオーバーライド
    このメソッドは AsyncTask  が実行されたときに、 onPostExecute  メソッドでレスポンスを受け取るのに必要になる。
  • POSTデータはバイト配列に変換する
    この例だと自作データクラス SendPostTaskParams  からPOSTデータのマップを取り出し、文字列化している。そのあと postData.toString().getBytes("UTF-8");  によってバイト配列に変換。

あとは説明するのが面倒なので、コメントとか見てください。

大体なにをしてるかは分かるはずです。

手順3.ActivityからPOST送信してJSONを受け取ってみる

あとは Activity 内の onStart とか onResume でPOST送信するだけ

レスポンスは AsyncTask  の onPostExecute  をオーバーライドすれば受け取れます。

 

ただ言葉だと分かりにくいので、
実際に適当なプロジェクトを作って、実際にPOST送信してみました。

▼ そのコードがコチラ

まず AsyncTask  をインスタンス化し、 execute  メソッドを実行。

ここで自作データクラス SendPostTaskParams  を使い、URLとPOSTデータをいろいろ渡してます。(こういう風に、データクラスを定義すると後で楽になる)

そして onPostExecute  をオーバーライドすれば、レスポンスが受け取るという感じ

AndroidでPOST送信のやり方まとめ

ちょっと長くなったので、箇条書きしてまとめます。

  1. POST送信用のデータクラスを作成
  2. POST送信するAsyncTaskクラス作成
  3. ActivityなどからPOST送信

箇条書きだとシンプルだけど、実際にコードを書いてみると大変

改めて「 Java って複雑で冗長だな~」ってことを思い出しました。

でもPOST送信できるようになったので一件落着です。ではまた($・・)/~~~

Commentsこの記事についたコメント

2件のコメント
  • タチコマ より:

    はじめまして。
    この記事を拝見させて頂きandroid studio【java】にかなり精通している方とお見受けし投稿させて頂いております。当方もandroid studioよるアプリ制作を行っているのですが、現在LINE notifyを使用し自作アプリ画面上のボタンを押したら固定のメッセージをスマホのLINEへ送るようにしたいと考えております。【まだ半年程度の初心者です。。】
    自分で調べた限りUIを操作するスレッド(メインとなるスレッド)でネットワーク通信をすることはできない事は理解したのですが、現在APIレベル30でAsyncTaskクラスも非推奨となってしまっているようで、別の手段を模索しております。。。ただ、万策尽きて方法が思いつかず、苦戦しているのですが何か参考になるコード又はサイトご存じないでしょうか?
    この手の技術はについてはまだ知識不足でして恐縮ですがアドバイス頂けたら幸いです。
    突然の投稿、誠に申し訳ありませんが何卒宜しくお願い致します。

    • ぴー助 より:

      コメントありがとうございます。
      AsyncTaskが非推奨になったことは記事にしようかな、と思っていた所です。代替策としてはFutureTaskなどを使うことですね。これと ExecutorService というのを合わせて使えばAsyncTaskと同じことができます。実際に実機で試したところ、エラーもなくPOST通信などができました。

      他にも代替手段はあるのですが、自分自身はFutureTaskを臨時的(あるいは半永久的)な手段として利用してます。具体的な方法とかコード例は次ページを参考にされてください。URL : https://www.journaldev.com/1650/java-futuretask-example-program

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください