質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    20775questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Java

    14060questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6621questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3778questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Eclipse

    1703questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Androidでの非同期処理。POSTでサーバーに渡したい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,444

現状

Androidで取得したデーターをサーバー(さくらインターネット)上のデーターベースに
PHPでPOSTしたいです。

メインスレッドで処理出来ていた頃は良かったのですが
Andoroid4?以降から非同期処理を使わなければいけなくなり
またHttpPost(HttpGet)も非推奨になったみたいでエラーが発生し困っています。

以前、書いていたコードは下記の通りです。

MainActivity.java

public class MainActivity extends Activity {
    private static final String url = "http://アドレス.php";

    @Override
    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);

    List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
    nameValuePair.add(new BasicNameValuePair("値1", data01));

    try{
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePair, "UTF-8"));
        HttpResponse response = httpclient.execute(httppost);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        response.getEntity().writeTo(byteArrayOutputStream);
        String oriText = byteArrayOutputStream.toString();
    }
     catch(UnsupportedEncodingException e){
         System.out.println("UnsupportedEncodingException");
    }
     catch(IOException e){
          System.out.println("IOException");
    }
}

上記コードを

MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ~省略~

        String url = "http:///アドレス.php";
        final AsyncHttpRequest asynctask = new AsyncHttpRequest(this);
        //実行
        asynctask.execute(url, data01);
    }

    public void result_job(String result) {
        System.out.println("メインに戻ってきた");
    }
}
AsyncHttpRequest.java

public class AsyncHttpRequest extends AsyncTask<String, String, String> {

    private MainActivity _main;

    public AsyncHttpRequest(MainActivity MainActivity) {
        super();
        _main = MainActivity;
    }

    @Override
    protected String doInBackground(String...params) {
    HttpURLConnection con = null;
    URL url = null;
    String  urlSt = params[0];
    String  data01 = params[1];

        try {
            url = new URL(urlSt);
            con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setChunkedStreamingMode(0);
            con.connect();

            //POSTパラメータ
            String postData = "data01=" + data01;

            //POSTデータ送信処理
            OutputStream out = null;

            out = con.getOutputStream();
            out.write(postData.getBytes("UTF-8"));
            out.flush();
            out.close();
            out.close();
            InputStream in = con.getInputStream();

            System.out.println("成功");
        }
            catch(IOException e){
            System.out.println("・IOException");
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
    return null;
    }

    @Override
    protected void onPostExecute(String result) {
        _main.result_job(result);
    }
}

としたものを

http://アドレス.php

~データーベース接続省略~

$data01 = $_POST[data01];

$sql = mysql_query(
"INSERT INTO `テーブル名` (`data01`)
VALUES
('$data01')"
);

と記述したPHPファイルで受け取ろうとしています。
http://アドレス.php
$data01に適当な値を入れてやるとデーターベースに書きこまれるので
PHPファイルに問題はないと考えています。

問題点

上記のプログラムを実行すると
System.out.println:IOException
System.out.println:メインに戻ってきた
と表示されてデータベースに書きこまれていません。

https://teratail.com/questions/29033
https://teratail.com/questions/29334
http://qiita.com/a_nishimura/items/19cf3f60ad1dd3f66a84
http://www.programing-style.com/android/android-api/android-httpurlconnection-post/
http://blog.a1yama.com/entry/2016/01/26/154932
http://techbooster.jpn.org/andriod/hacks/7902/
https://www.ipentec.com/document/document.aspx?page=android-get-html-file-use-http-for-android4
上記、参考にしたサイトです。

追記です。

out.close();
上記ありがとうございます。気付いていませんでした。

printStackTrace()を出した結果が下記です。

java.net.UnknownHostException: http:///アドレス.php
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:279)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
at com.アプリ名.AsyncHttpRequest.doInBackground(AsyncHttpRequest.java:32)
at com.アプリ名.AsyncHttpRequest.doInBackground(AsyncHttpRequest.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

今は時間が無くて調べられていないのですが
UnknownHostExceptionとあるのでDNSの名前解決が出来ていないみたいです?
同じアプリ内でサーバー上の別ルートに置いている掲示板(webviewを利用)動かしてますが
問題が出ていないので余計に謎が深まってしまいました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/05/10 23:21

    catchの中でprintStackTrace()をしてスタックトレースを出してみて下さい。これで,どこでエラーが起こったのかわかるはずです。あと,もしかしたら違うかもしれませんが, out.close();を2回呼んでいるのがいけないのかもしれません。

    キャンセル

回答 1

0

アドレスは正しいですか?
http:///とスラッシュが3になってるのは誤字ですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/11 16:06 編集


    完全にミスしていました。
    javaファイルに記述しているものを直接コピペし
    ブラウザのアドレスに挿入してアクセスしていたのでまさかとは思いましたが
    「///」となっていたのが原因でした。

    これで上手くいけば良かったのですが
    POSTしたはずなのにデータベースに書かれた数値は空でした。

    以前回答されていた
    https://teratail.com/questions/23043
    を見て追記しますと

    送信する文字列は
    半角英数字に日本語文字です。

    受信側のPHPファイルを
    $data01 = $_GET[data01];
    $data01 = $_REQUEST[data01];
    等に変更してみましたが、それでもダメでした。

    またリクエストの件ですが
    SQLに空とはいえレコードは挿入されるので
    ファイルにアクセスをするまではいっていると思います。

    ステータスコードは
    表示の仕方を調べているためお待ちください。

    ステータスコードを取得してみた所
    200が返ってきていました。

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14504&forum=12
    を見ると順番が怪しそうだったので
    POSTデータ処理より下記の部分を

    //POSTデータ送信処理
    OutputStream out = null;

    out = con.getOutputStream();
    out.write(postData.getBytes("UTF-8"));
    InputStream in = con.getInputStream();
    out.flush();
    out.close();
    int status = con.getResponseCode();

    System.out.println("ステータス表示:" + status);

    と変えてみましたがダメでした。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20775questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Java

    14060questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6621questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3778questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Eclipse

    1703questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。