【J 2 ME】J 2 MEではPostでWebServiceにアクセス--Listenerでコールバック


まず、主なクラスを見てみましょう.
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

import cn.dcbiz.util.Log;

public class NetUtil {
	private static final String TAG = "NetUtil";

	/**
	 *       ,        。      INetCallbackListener  
	 * 
	 * @param url
	 *               URL
	 * @param key
	 *                
	 * @param values
	 *                ,  key    
	 * @param lsn
	 *                 
	 */
	public static void execute(final String url, final String[] key,
			final String[] values, final INetCallbackListener lsn) {
		new Thread() {
			public void run() {
				Log.d(TAG, "    :" + url);
				lsn.onNetStateChange(INetCallbackListener.STATE_SENDING, "      ");
				OutputStream os = null;
				DataInputStream dis = null;
				InputStream in = null;
				HttpConnection conn = null;
				StringBuffer sb = new StringBuffer();
				for (int i = 0; i < values.length; i++) {//       
					sb.append(key[i]);
					sb.append("=");
					sb.append(values[i]);
					sb.append("&");
				}
				String body = sb.toString();
				body = body.substring(0, body.length() - 1);
				Log.d(TAG, "  :" + body);
				try {
					conn = (HttpConnection) Connector.open(url);
					conn.setRequestMethod(HttpConnection.POST);
					conn.setRequestProperty("Content-Type",
							"application/x-www-form-urlencoded");//        
					conn.setRequestProperty("Content-Length",
							body.getBytes().length + "");
					os = conn.openOutputStream();
					os.write(body.getBytes("utf-8"));
					int resCode = conn.getResponseCode();
					Log.d(TAG, "resCode:" + resCode);
					if (resCode == HttpConnection.HTTP_OK) {
						in = conn.openInputStream();
						int len2 = (int) conn.getLength();
						dis = new DataInputStream(in);
						byte[] bs = new byte[len2];
						dis.read(bs);
						String result = new String(bs, "utf-8");
						Log.d(TAG, "    :" + result);
						result = result.substring(
								result.indexOf("<string>") + 8,
								result.lastIndexOf('<'));
						lsn.onNetStateChange(INetCallbackListener.STATE_SENDOVER,
								result);
					} else {
						lsn.onNetStateChange(INetCallbackListener.STATE_SENDERROR, ""
								+ resCode);
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					lsn.onNetStateChange(INetCallbackListener.STATE_SENDERROR,
							e.getMessage());
				} finally {
					try {
						dis.close();
						in.close();
						os.close();
						conn.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			};
		}.start();
	}

}

説明:public static void execute(final String url,final String[]key,final String[]values,final INetCallback Listener lsn)この方法はWebServiceにアクセスする重要な方法です.
最初のパラメータはWebServiceのURLで、
2番目のパラメータと3番目のパラメータは、WebServiceにアクセスするパラメータと値です.入力時には、ログインインタフェースにアクセスするなど、1つずつ対応します.入力:username=denger&password=123456、剛
key = {"username", "password"};   values = {"denger", "123456"};
3番目のパラメータ、INetCallbackListenerは私が書いたインタフェースで、アクセス終了のコールバック方法をする方法は1つしかありません.リスナーとして理解でき、呼び出しはすべて実現すればよい.
インタフェースは次のとおりです.
/**
 *     
 * 
 * @author Denger
 * 
 */
public interface INetCallbackListener {
	/**
	 *     
	 */
	public static final int STATE_SENDING = 0;
	/**
	 *     ,           ,         
	 */
	public static final int STATE_SENDOVER = 1;
	/**
	 *     
	 */
	public static final int STATE_SENDERROR = -1;
	
	//////////////////////////
	/**
	 *           
	 */
	public static final String MSG_NO_TEL = "-1";
	
	/**
	 *     
	 */
	public static final String MSG_PUBLISH_SUC = "true";
	
	/**
	 *          
	 * 
	 * @param state
	 * @param msg
	 *               state {@link #STATE_SENDOVER} ,msg  Server   JSON   
	 */
	void onNetStateChange(int state, String msg);

}

呼び出しはすべて上記のインタフェースを実現し,onNetStateChangeメソッドのコールバックに基づいてネットワーク状態stateによって異なるヒントやイベントを行うことができる.