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" />

发布了146 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43689040/article/details/103761411