这里模仿登录,实现一个简单的GET请求
public class MainActivity extends AppCompatActivity {
private static final int ERROR = 0;
private static final int SUCCESS = 1;
private EditText ed_username;
private EditText ed_password;
private String username;
private String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取账号和密码输入控件
ed_username = (EditText) findViewById(R.id.ed_username);
ed_password = (EditText) findViewById(R.id.ed_password);
}
Handler handler = new Handler(){
@Override
//后面handler.sendMessage() 所发送过来的消息,都会在这被处理
public void handleMessage(Message msg) {
switch (msg.what){
case SUCCESS:
//请求发送成功,会将服务器返回的信息通过Toast显示给用户
Toast.makeText(MainActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
break;
case ERROR:
Toast.makeText(MainActivity.this, "出错了", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
public void login(View v){
//获取输入的账号和密码
username = ed_username.getText().toString().trim();
password = ed_password.getText().toString().trim();
if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
Toast.makeText(this, "账号或密码不能为空!", Toast.LENGTH_SHORT).show();
}
//发送网络请求,这步需要在子线程中完成
new Thread(){
public void run() {
try {
//请求的地址
String path = "http://192.168.1.105:80/index.php";
//如果账号是中文需要进行编码
username = URLEncoder.encode(username, "UTF-8");
path = path + "?username=" + username + "&password=" + password;
URL url = new URL(path);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//设置请求方式
con.setRequestMethod("GET");
//设置请求超时时间
con.setConnectTimeout(5000);
//获取响应的状态码
final int code = con.getResponseCode();
if(code == 200){
//获取服务器返回的流数据
InputStream in = con.getInputStream();
//解码流数据,转换成字符串,这个StreamTools是自己定义的
String value = StreamTools.decodeStream(in);
//获取一个消息对象
Message msg = Message.obtain();
//设置状态为SUCCESS,表示请求成功,这个是自己定义的
msg.what = SUCCESS;
//将服务器数据赋值给消息中的一个Object对象
msg.obj = value;
//发送消息,交给handler 去处理数据,并将结果返回给用户
handler.sendMessage(msg);
}else{
//表示请求失败
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
解析流数据的工具类
public class StreamTools {
public static String decodeStream(InputStream in) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while ( (len = in.read(buf)) > 0 ){
baos.write(buf, 0, len);
}
baos.close();
return baos.toString();
}
}
android App 要想发送网络请求还需要在mainsfest中添加这一行,表示允许app使用网络
<uses-permission android:name="android.permission.INTERNET" />