Android网络前台向服务端页面请求数据

这是一个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();
		}
      }
}

最后别忘了对网络权限的设置。

运行效果:

猜你喜欢

转载自my.oschina.net/u/3630543/blog/1796374
今日推荐