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) 用 ボタンイベントテンプレート






