ニュースクライアント&ネットワークプログラミングday 1の作成(66期4日目)


ネットワーク画像ビューア(把握)
  • 画像のURLを確定する
  • httpリクエスト
    URL url = new URL(address);
    //      ,       
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //         
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(5000);
    //      ,      
    conn.setRequestMethod("GET");
    //    ,  get  
    //conn.connect();
    //    ,       ,200      
    conn.getResponseCode();
    
  • を送信する.
  • サーバのピクチャは、ブラウザにストリームとして返す
    //           
    InputStream is = conn.getInputStream();
    //          ,      
    Bitmap bm = BitmapFactory.decodeStream(is);
    
  • である.
  • 画像をImageViewの表示内容
    ImageView iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bm);
    
  • に設定する.
  • 権限の追加
  • プライマリ・スレッドをブロックできません
  • Androidでは、メインスレッドがブロックされるとuiインタフェースをリフレッシュできず、ユーザーの操作に応答できず、ユーザー体験が非常に悪い
  • になります.
  • メインスレッドのブロック時間が長すぎると、ANR異常
  • が放出されます.
  • ANR:Application Not Response;応答なしアプリケーション
  • 主スレッド
  • には、時間のかかる操作を書くことはできません.
  • ネットワークインタラクションは時間のかかる操作であるため、ネットワーク速度が遅いとコードがブロックするため、ネットワークインタラクションのコードはメインスレッド
  • で実行できない.
    uiをリフレッシュできるのはプライマリスレッドのみです
  • uiをリフレッシュするコードはメインスレッドでのみ実行でき、サブスレッドで実行すると何の効果もない
  • である.
  • サブスレッドでuiをリフレッシュする必要がある場合、メッセージキューメカニズム
  • を使用する.
  • プライマリスレッドはuiスレッド
  • とも呼ばれます.
    メッセージキュー(重要な把握)
  • メインスレッドが作成されると、メッセージキューオブジェクト(MessageQueue)とメッセージポーリングオブジェクト(Looper)
  • が同時に作成されます.
  • ポーリングの役割は、メッセージキューにメッセージがあるかどうかを検出する
  • である.
  • Looperは、Message Queueにメッセージがあることを発見すると、メッセージを取り出し、Handlerオブジェクトにメッセージを投げつけ、Handlerは自分のhandleMessageメソッドを呼び出してこのメッセージを処理する
  • handleMessageメソッドは、メインスレッド
  • で実行される.
  • メインスレッドが作成すると、メッセージキューとポーリングオブジェクトが作成されますが、メッセージプロセッサオブジェクトは、使用する必要がある場合は、自分で
    //    
    Handler handler = new Handler(){
        //            looper,               ,        ,       ,              
        public void handleMessage(android.os.Message msg) {
    
        }
    };
    
  • を作成します.
  • サブスレッドでHandlerオブジェクトを使用してメッセージキューにメッセージ
    //      
    Message msg = new Message();
    //   obj          ,            
    msg.obj = bm;
    //what         ,          ,         
    msg.what = 1;
    //    
    handler.sendMessage(msg);
    
  • を送信する.
  • 異なるメッセージ
    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
        //   1,           
        case 1:
            ImageView iv = (ImageView) findViewById(R.id.iv);
            Bitmap bm = (Bitmap) msg.obj;
            iv.setImageBitmap(bm);
            break;
        case 2:
            Toast.makeText(MainActivity.this, "    ", 0).show();
            break;
        }       
    }
    
  • をswitch文で区別する.
    キャッシュ画像の機能を追加(熟知)
  • サーバが返すストリームのデータを読み出し、ファイル入力ストリームを介してローカルファイル
    //1.           
    InputStream is = conn.getInputStream();
    //2.          ,      
    
    FileOutputStream fos = new FileOutputStream(file);
    byte[] b = new byte[1024];
    int len = 0;
    while((len = is.read(b)) != -1){
        fos.write(b, 0, len);
    }
    
  • に書き込む.
  • bitmapオブジェクトを作成するコードを
    Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
    
  • に変更する.
  • は、要求を送信前に、キャッシュに同名のピクチャが存在するか否かを検出し、存在する場合には、キャッシュ
  • を読み出す.
    オープンソースのWebサイトを入手(熟知)
  • code.google.com
  • github.com
  • githubでsmart-image-view
  • を検索
  • オープンソースプロジェクトsmart-image-view
  • をダウンロード
  • カスタムコンポーネントを使用する場合、ラベル名はパッケージ名
    <com.loopj.android.image.SmartImageView/>
    
  • と書く.
  • SmartImageViewの使用
    SmartImageView siv = (SmartImageView) findViewById(R.id.siv);
    siv.setImageUrl("http://192.168.1.102:8080/dd.jpg");
    
  • Htmlソースファイルビューア(把握)
  • GET要求
    URL url = new URL(path);
    //      
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //      
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(5000);
    //    ,     
    if(conn.getResponseCode() == 200){
    
    }
    
  • を送信する.
  • サーバから返すストリームを取得し、ストリームからhtmlソースコードを読み出す
    byte[] b = new byte[1024];
    int len = 0;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    while((len = is.read(b)) != -1){
        //                    
        bos.write(b, 0, len);
    }
    //                  
    //    utf-8
    text = new String(bos.toByteArray());
    
  • .
    文字化けしの処理
  • の文字化けしは、サーバとクライアントのコードテーブルが一致しないため、
    //      
    text = new String(bos.toByteArray(), "gb2312");
    
  • が発生する.
    データの提出(把握)
    GET方式提出データ
  • get方式でコミットされたデータはurlの末尾
    final String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + name + "&pass=" + pass;
    
  • に直接接続されている.
  • はgetリクエストを送信し、コードは以前と同じ
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setReadTimeout(5000);
    conn.setConnectTimeout(5000);
    if(conn.getResponseCode() == 200){
    
    }
    
  • である.
  • ブラウザはデータの携帯を要求する送信時にデータに対してURL符号化を行い、私達がコードを書く時も中国語に対してURL符号化
    String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + URLEncoder.encode(name) + "&pass=" + pass;
    
  • を行う必要がある.
    POST方式提出データ
  • postコミットデータは、出力ストリームでサーバに書き込む
  • である.
  • プロトコルヘッダに2つのプロパティが追加されました
  • Content-Type:アプリケーション/x-www-form-urlencoded、コミットされたデータを記述するmimetype
  • Content-Longth:32、コミットされたデータの長さを記述する
    //      post        
    String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("Content-Length", data.length() + "");
    
  • post要求を開くことを許可するストリーム
    conn.setDoOutput(true);
    
  • を設定する.
  • 接続オブジェクトの出力ストリームを取得し、サーバに提出するデータ
    OutputStream os = conn.getOutputStream();
    os.write(data.getBytes());
    
  • をストリームに書き込む.