知識點:
當數據量很大,我們需要使用網絡存儲
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()
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.mipmap.out);
}
});
解決辦法2: 使用異步任務
創建類繼承AsyncTask
AsyncTask<String,Void,String>參數說明
1:請求訪問的地址
2:更新進度條 水平的有效
3:異步任務完事了返回的結果
class MyTask extends AsyncTask<String,Void,Bitmap>{
//用來更新進度條
@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("");
網絡獲取
1.頁面準備一個按鈕
2.創建web servlet
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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="MyServlet" method="post" enctype="application/x-www-form-urlencoded">
<input type="submit"/>
</form>>
</body>
</html>
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<String,Void,String>{
@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中進行權限設置
<uses-permission android:name="android.permission.INTERNET" />