这是一个android前台向服务端网站请求少量数据的小例子。
首先设计好服务端,再来写安卓前端。
一:服务端
- 新建动态网站,在java包下新建一个类继承HttpServlet父类,重写doGet()方法,向客户端输出文字。
- 部署这个类,把这个类的包和class文件复制到WEB-INF的classes目录下,在web.xml文件配置这个文件的网络路径。
Internet文件的代码:
package android;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Internet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO 自动生成的方法存根
//super.doGet(req, resp);
resp.setContentType("text/html;charset=utf-8");
PrintWriter print=resp.getWriter();
print.println("你好!");//客户端可以接收得到,本网页显示
print.println("上海!");
print.flush();//flush()不可以少
System.out.println("瓜瓜!");//客户端接收不到,本网页不显示,输出在控制台
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO 自动生成的方法存根
super.doPost(req, resp);
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO 自动生成的方法存根
super.service(arg0, arg1);
}
@Override
public void init() throws ServletException {
// TODO 自动生成的方法存根
super.init();
}
}
配置的web.xml
<servlet>
<servlet-name>a</servlet-name>
<servlet-class>android.Internet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
访问路径:
至此服务端的书写已经成功,接下来开始安卓端的书写。
二:安卓手机端
- 编写主线程,处理子线程拿到数据后对数据的展示。
- 编写子线程,用于连接服务器端拿到数据,并发送给主线程。
- 附上代码:
activity_main.xml只有一个控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" "
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
主线程MainActivity.java
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
import com.internethttp.R;
public class MainActivity extends ActionBarActivity {
String url="http://ly-and-tl.uicp.cn:42696/AndroidServer/b";//服务端的servlet页面网址,在web.xml页面中已配置
TextView tv;
Handler handler;
@SuppressLint("HandlerLeak") @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.textView);
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==3){//后台发送消息切换回主线程后的处理
CharSequence ss=(CharSequence)msg.obj;//拿到消息的包裹信息
System.out.println(ss+"MainActivity");
if(ss!=null){
tv.setText(ss);//只能在主线程更新UI
}
}
}
};
new HttpThread(url,handler).start();
}
}
子线程HttpThread.java
public class HttpThread extends Thread {
String url;
Handler handler;
HttpThread(String url,Handler hand){
this.url=url;
handler=hand;
}
@Override
public void run() {//向后台请求数据
// TODO Auto-generated method stub
//super.run();
URL httpUrl;
try {
httpUrl=new URL(url);
HttpURLConnection conn=(HttpURLConnection)(httpUrl.openConnection());
//打开服务端的某个页面链接就相当于自动调用doGet()方法
conn.setReadTimeout(5000);
//5000秒内不返回就报错
conn.setRequestMethod("GET");
//bufferReader适合中文类,HttpURLConnection的getInputStream()方法返回一个InputStream对象,
//InputStreamReader接收InputStream对象能实例化一个InputStreamReader,
//bufferedReader能接收一个InputStreamReader对象实例化自己
BufferedReader buff=new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb=new StringBuffer();
String str;
while((str=buff.readLine())!=null){
//readLine()返回String对象,从后台拿到数据存到String对象
sb.append(str);
}
System.out.println(sb+"HttpThread");
Message msg=handler.obtainMessage(3);
msg.obj=sb;
handler.sendMessage(msg);
//发送到主线程,立刻切换线程
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后别忘了对网络权限的设置。
运行效果: