Android の インターネットアクセスでは、AsyncTask がついて回るので、とにかくコンパクトにして、ADT の支援機能をうまく使って記述できるように頑張ってみました。とにかく、『使える』事を最優先にすると、目的毎にクラスを作ったほうが良いので、結果が XML の Documnet で返ってくるようにしています。( もちろん、JSON 用なら別に作成します )
package com.example.httppost; import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.Iterator; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import android.os.AsyncTask; import android.util.Log; public class HttpPostAndXml extends AsyncTask<Map, Void, Document> { @Override protected Document doInBackground(Map... params) { Document xml_data = null; Map<String,String> myArg = params[0]; try { // ターゲット URL url = new URL(myArg.get("url")); // 接続オブジェクト HttpURLConnection http = (HttpURLConnection)url.openConnection(); http.setConnectTimeout(30000); http.setReadTimeout(30000); http.setDoInput(true); // application/x-www-form-urlencoded がセットされる http.setRequestMethod("POST"); OutputStreamWriter osw = new OutputStreamWriter(http.getOutputStream()); BufferedWriter bw = new BufferedWriter(osw); Iterator<String> it = myArg.keySet().iterator(); String key = null; String value = null; String data = ""; while(it.hasNext()) { key = it.next().toString(); if ( key.equals("url") ) { continue; } value = myArg.get(key); if ( !data.equals("") ) { data += "&"; } data += key + "=" + URLEncoder.encode(value, "utf-8") ; } Log.i("",data); bw.write( data ); bw.close(); osw.close(); DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbfactory.newDocumentBuilder(); // InputStream から Documentオブジェクトを取得 xml_data = builder.parse(http.getInputStream()); // 接続解除 http.disconnect(); } catch(Exception e) { Log.i("MyList", e.getMessage()); } return xml_data; } }
呼び出し方法
package com.example.httppost; import java.util.HashMap; import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // ボタンのプロパティに設定するイベント public void postAction(View v) { EditText et = (EditText)this.findViewById(R.id.editText1); Map<String,String> map = new HashMap<String,String>(); map.put("url", "呼び出す URL"); map.put("u", et.getText().toString()); new HttpPostAndXml(){ @Override protected void onPostExecute(Document result) { if ( result == null ) { return; } // ルート要素 Element root = result.getDocumentElement(); NodeList node_list = root.getElementsByTagName("item"); for( int i = 0; i < node_list.getLength(); i++ ) { NodeList nl = ((Element)node_list.item(i)).getElementsByTagName("title"); Log.i("MyList", nl.item(0).getFirstChild().getNodeValue()); } } }.execute(map); } }
HttpPostAndXml の無名クラスで、http のアクセス部分は内部の非同期部分にまかせて、結果部分のみ Override しています。実行時の引数としては、HashMap に "url" を含ませて、それ以外は全て送信データとして UTF8 で UrlEncode して送信しています。 テスト画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:onClick="postAction" android:text="Button" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_alignRight="@+id/button1" android:layout_below="@+id/button1" android:layout_marginTop="20dp" android:ems="10" android:gravity="top|left" android:height="200dp" android:inputType="textMultiLine" android:scrollbars="vertical" > </EditText> </RelativeLayout>
|
【Androidの最新記事】
- デバイスを探す / Find My Device - Google / Android Find
- JavaScript から Android へアクセス
- Monaca と 本当の 『Onsen UI最小限のテンプレート』
- Android 5.1 リリース済み。SDK( android-sdk_r24.0.2-windows.zip ) でまずエミュレータ作って、あとから Eclipse と Android Studio..
- クラウドでアプリを作成してスマホで動作させる『Monaca』を Android エミュレータの 5.1 で動作確認しました
- Android で Post と Get
- 別の ADT(Android) で作成されたワークスペースを最新の ADT で開く場合の操作方法
- Android : ListView Twitter 検索テンプレート
- トラブル : AndroidManifest.xml に XML 宣言があるとエラーになる???
- Twitter API の自分のアプリのトークンを使って投稿するだけの class Android_Twitter
- Android 単純リストビューを google-gson で最速構築
- Android をテストするのにほんの少し楽になるかもしれないクラス
- Android : Google Spreadsheets API version 3.0でGoogleスプレッドシートを参照
- Android 4.2.2(ADT) : class MyDatePicker extends DatePickerDialog
- Android : 日付ダイアログをインナーで使う( 完了ボタンをクリックした場合としない場合の対応 )
- Android(4.2.2) ADT から Post や Get をできるかぎり簡単にするサンプル
- Android ADT : 単純画面遷移
- HashMap の Key と Value をそれぞれソートして、最終的には 配列に変換して テンプレートを使って for ループを簡単に記述する
- ADT Eclipse : sysout テンプレートの変更
- Android(ADT Eclipse) 用 ボタンイベントテンプレート