Android開発におけるネットワークプログラミングのHttpURLConnectionの基本的な使い方(まとめ)


HttpURLConnectionの使用手順
HttpURLConnectionを使用するには、次の手順に従います.
  • URLオブジェクトを作成する:URL url=new URL(http://www.baidu.com);
  • URLオブジェクトのopenConnection()を呼び出して、HttpURLConnectionオブジェクトインスタンス:HttpURLConnection conn=(HttpURLConnection)url.openConnection()を取得します.
  • HTTPリクエストの使用方法を設定する:GETまたはPOST、または他のリクエスト方法、例えば:PUTconn.setRequestMethod(「GET」)
  • 接続タイムアウト、読み出しタイムアウトのミリ秒数、およびサーバが取得したいメッセージヘッダconn.setConnectTime out(6*1000)を設定します.conn.setReadTimeout(6 * 1000);
  • getInputStream()メソッドを呼び出してサーバから返される入力ストリームを取得し、入力ストリームはInputStream in=conn.getInputStream()を読み出す.
  • 最後にdisconnect()メソッドを呼び出してHTTP接続をconn.disconnect()オフにする.

  • 実例の効果図は以下の通りです.
    Android开发中网络编程之HttpURLConnection的基本用法(总结)_第1张图片
    まず、GetData.java(ネットワーク画像の取得)、StreamTool.java(ストリームをバイナリ配列に変換するツールクラス)の2つのツールクラスを添付します.
    StreamTool.java
    package com.deepreality.httpurlconnectiondemo;
    
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    
    /**
     *               
     */
    public class StreamTool {
        //       
        public static byte[] read(InputStream inStream) throws Exception{
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len = inStream.read(buffer)) != -1)
            {
                outStream.write(buffer,0,len);
            }
            inStream.close();
            return outStream.toByteArray();
        }
    }
    

    GetData.java
    package com.deepreality.httpurlconnectiondemo;
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    
    /**
     *                 
     */
    public class GetData {
        //                :
        public static byte[] getImage(String path) throws Exception {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //        5 
            conn.setConnectTimeout(5000);
            //        Get  
            conn.setRequestMethod("GET");
            //     Url    
            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("  url  ");
            }
            InputStream inStream = conn.getInputStream();
            byte[] bt = StreamTool.read(inStream);
            inStream.close();
            return bt;
        }
    
        //      html   
        public static String getHtml(String path) throws Exception {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            if (conn.getResponseCode() == 200) {
                InputStream in = conn.getInputStream();
                byte[] data = StreamTool.read(in);
                String html = new String(data, "UTF-8");
                return html;
            }
            return null;
        }
    }
    

    MainActivity.javaのコードは次のとおりです.
    package com.deepreality.httpurlconnectiondemo;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.webkit.WebView;
    import android.widget.ImageView;
    import android.widget.ScrollView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView txtMenu, txtshow;
        private ImageView imgPic;
        private WebView webView;
        private ScrollView scroll;
        private Bitmap bitmap;
        private String detail = "";
        private boolean flag = false;
        private final static String PIC_URL = "http://ww2.sinaimg.cn/large/7a8aed7bgw1evshgr5z3oj20hs0qo0vq.jpg";
        private final static String HTML_URL = "http://www.baidu.com";
    
        //       
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case 0x001:
                        hideAllWidget();
                        imgPic.setVisibility(View.VISIBLE);
                        imgPic.setImageBitmap(bitmap);
                        Toast.makeText(MainActivity.this, "      ", Toast.LENGTH_SHORT).show();
                        break;
                    case 0x002:
                        hideAllWidget();
                        scroll.setVisibility(View.VISIBLE);
                        txtshow.setText(detail);
                        Toast.makeText(MainActivity.this, "HTML      ", Toast.LENGTH_SHORT).show();
                        break;
                    case 0x003:
                        hideAllWidget();
                        webView.setVisibility(View.VISIBLE);
                        webView.loadDataWithBaseURL("", detail, "text/html", "UTF-8", "");
                        Toast.makeText(MainActivity.this, "      ", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bindViews();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (bitmap.isRecycled()) {
                bitmap.recycle();
            }
        }
    
        private void bindViews() {
            txtMenu = (TextView) findViewById(R.id.txtMenu);
            txtshow = (TextView) findViewById(R.id.txtshow);
            imgPic = (ImageView) findViewById(R.id.imgPic);
            webView = (WebView) findViewById(R.id.webView);
            scroll = (ScrollView) findViewById(R.id.scroll);
            registerForContextMenu(txtMenu);
        }
    
        //              :
        private void hideAllWidget() {
            imgPic.setVisibility(View.GONE);
            scroll.setVisibility(View.GONE);
            webView.setVisibility(View.GONE);
        }
    
        /**
         *             
         * @param menu
         * @param v
         * @param menuInfo
         */
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            MenuInflater inflator = new MenuInflater(this);
            inflator.inflate(R.menu.menus, menu);
            super.onCreateContextMenu(menu, v, menuInfo);
        }
    
        /**
         *               
         * @param item
         * @return
         */
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.one:
                    new Thread() {
                        public void run() {
                            try {
                                byte[] data = GetData.getImage(PIC_URL);
                                bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            handler.sendEmptyMessage(0x001);
                        }
                    }.start();
                    break;
                case R.id.two:
                    new Thread() {
                        public void run() {
                            try {
                                detail = GetData.getHtml(HTML_URL);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            handler.sendEmptyMessage(0x002);
                        }
                    }.start();
                    break;
                case R.id.three:
                    if (detail.equals("")) {
                        Toast.makeText(MainActivity.this, "   HTML  ~", Toast.LENGTH_SHORT).show();
                    } else {
                        handler.sendEmptyMessage(0x003);
                    }
                    break;
            }
            return true;
        }
    }
    

    ここでmenus.xmlはres/menu/以下に作成されたメニューファイルです.
    menus.xml
    xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.menutest.MainActivity" >
    
                android:id="@+id/one"
            android:orderInCategory="100"
            android:title="    "/>
    
                android:id="@+id/two"
            android:orderInCategory="200"
            android:title="  HTML"/>
    
                android:id="@+id/three"
            android:orderInCategory="200"
            android:title="    "/>