Android:網絡存儲(1)

知識點:

當數據量很大,我們需要使用網絡存儲
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);
                            }
                        });
  1. 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" />

發佈了149 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章