对于网络编程一直处于害怕阶段,因为重来没有接触过,今天初步学习了下一个网络图片查看器的写法,主要功能是用户通过EditText输入网络图片的地址,然后点击Button,在网络通畅并且地址确实存在的情况下,下方的ImageView会直接显示出该图片,界面很丑,代码没有做太多处理,比如输入的是否是合适代码等等,全部都没有进行判断,将就的看看吧。代码如下:
1.MainActivity.java
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
//三个状态码,分别是成功、失败、异常
protected static final int SCUESS = 1;
protected static final int FAILED = 2;
protected static final int ERROR = 3;
private EditText et_Input;
private ImageView iv;
/**
* 定义Handler消息处理器,并重写里面的handlermessage()方法
* 该方法用来接收子线程发来的消息,在主线程中根据状态码分别进行处理。
*/
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SCUESS:
Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap(bitmap);
break;
case FAILED:
Toast.makeText(MainActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
break;
case ERROR:
Toast.makeText(MainActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_Input = (EditText) findViewById(R.id.et_input);
iv = (ImageView) findViewById(R.id.iv);
}
public void click(View v) {
//获取用户输入框的值
final String path = et_Input.getText().toString().trim();
//开启子线程
new Thread() {
public void run() {
try {
URL url = new URL(path);
/**
* 需要注意的是,由于本程序的功能是网络图片查看器,因此在访问网络时需要先申请权限
* 权限为:
* <uses-permission android:name="android.permission.INTERNET"/>
*/
//定义连接方式为http方式
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
//使用GET请求
conn.setRequestMethod("GET");
//设置请求后的延时时间
conn.setConnectTimeout(5000);
//获取服务器返回的状态码
int code = conn.getResponseCode();
//状态码200为请求成功
if (code == 200) {
// 请求成功
//获取服务器返回的输入流
InputStream is = conn.getInputStream();
//使用BitmapFactory中的decodeStream()方法对输入流进行处理
Bitmap bitmap = BitmapFactory.decodeStream(is);
//定义消息,并使用消息回收器。
Message msg = Message.obtain();
//设置消息的状态码
msg.what = SCUESS;
//设置消息内容
msg.obj = bitmap;
//发送消息,由于消息接收器在主线程中定义的,因此可以理解为向主线程发送消息
handler.sendMessage(msg);
} else {
// 请求失败
Message msg = Message.obtain();
msg.what = FAILED;
msg.obj = "请求失败";
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
// 出现异常
Message msg = Message.obtain();
msg.what = ERROR;
msg.obj = "出现异常";
handler.sendMessage(msg);
}
};
}.start();
}
}
2.activity_main.xml
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/et_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="http://h.hiphotos.baidu.com/image/w%3D310/sign=d0f407c47e1ed21b79c928e49d6eddae/0b55b319ebc4b74514c92120ccfc1e178a8215a2.jpg" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="查看" />
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
3.AndroidManifest.xml(前后省略,重点部分已改颜色)
……
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
……
最终执行之后的结果如下图: