SQLの窓

2013年06月08日


Android から Post 投稿 / HttpPostAndXml extends AsyncTask<Map, Void, Document>

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の最新記事】
posted by lightbox at 2013-06-08 21:43 | Android | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり