当数据量很大,我们需要使用网络存储
mysql数据库,windows javaWeb C
servlet里访问mysql
浏览器输入地址 就访问servlet
安卓手机访问tomcat服务器地址 去访问servlet 操作数据库
app连接web端,连接web端不能在android的主线程去做(main )
需要使用异步任务 ajax
Andoid的单线程模式必须遵守两个规则:
1.不要阻塞UI线程。
2.不要在UI线程之外访问Andoid的UI组件包。
例:阻塞UI线程
和
对比在UI线程之内/外访问Andoid的UI组件包
布局:
代码:
public class MainActivity extends AppCompatActivity {
private Button log;
private Button button;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
log= (Button) findViewById(R.id.log);
button= (Button) findViewById(R.id.button);
imageView= (ImageView) findViewById(R.id.imageView);
log.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("message","log");
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// imageView.setImageResource(R.mipmap.out);//在UI线程内访问
//在UI线程外访问
new Thread(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.mipmap.out);
}
}).start();
}
});
}
}
在UI线程外访问,解决办法1: 把重绘界面这个事件拉回到UI线程
1.runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.mipmap.out);
}
});
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.mipmap.out);
}
});
解决办法2: 使用异步任务
创建类继承AsyncTask
AsyncTask
1:请求访问的地址
2:更新进度条 水平的有效
3:异步任务完事了返回的结果
class MyTask extends AsyncTask{
//用来更新进度条
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
//子线程用来获取异步任务数据的,此方法中的代码相当于在你自己new的线程中执行
@Override
protected Bitmap doInBackground(String... params) {
//去本地取得图片
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.out);
return bitmap;
}
//异步任务中用来更新控件的。参数是doInBackground的返回值
@Override
protected void onPostExecute(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
super.onPostExecute(bitmap);
}
}
在事件中启动异步任务
//启动异步任务
MyTask myTask=new MyTask();
myTask.execute("");
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
//创建请求 连接Servlet 发送数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//提交表单 接完数据处理完 响应
System.out.print("111");
PrintWriter out= response.getWriter();
out.print("123");
out.flush();
out.close();
}
}
3.创建一个JSP测试servlet
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
>
4.Servlet 可以正常使用后,写Main2Activity逻辑
public class Main2Activity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//异步访问selvet
Task task=new Task();
//http://192.168.1.3:8080/lesson13/MyServlet
//在安卓中不认识localhost
task.execute("http://10.151.2.14:8080/lesson13/MyServlet");
}
});
}
class Task extends AsyncTask{
@Override
protected String doInBackground(String... params) {
//连接servlet
try {
HttpURLConnection httpURLConnection= (HttpURLConnection) new URL(params[0]).openConnection();
//设置请求方式
httpURLConnection.setRequestMethod("GET");//参数必须大写
//设置读取超时时间
httpURLConnection.setReadTimeout(30000);
//接到响应的数据
InputStream inputStream=httpURLConnection.getInputStream();
//实际的数据是字符串 把inputStream变成Reader
Reader reader= new InputStreamReader(inputStream);
//一行一行读
BufferedReader bufferedReader= new BufferedReader(reader);
StringBuffer stringBuffer=new StringBuffer();
String str=null;
while ( (str=bufferedReader.readLine())!=null){
stringBuffer.append(str);
}
return stringBuffer.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.i("message",s);
}
}
}
注意!!
在manifest中进行权限设置