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