Android从零开始(十五)
16lz
2021-01-26
知识点:异步任务AsyncTask
Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1、 不要阻塞UI线程
2、 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。 Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。 AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法 onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建 2) execute方法必须在UI thread中调用 3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
好了废话不说了看一下一个简单的例子吧·····
步骤一、建立服务器(我这里建立的是一个web服务,只有一个简单的servlet)代码如下
步骤二、建立一个Android项目(主页文件代码如下
步骤三、Activity编写事件方法(代码如下)
源码下载请点击这里:
Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1、 不要阻塞UI线程
2、 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。 Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。 AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法 onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建 2) execute方法必须在UI thread中调用 3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
好了废话不说了看一下一个简单的例子吧·····
步骤一、建立服务器(我这里建立的是一个web服务,只有一个简单的servlet)代码如下
package myaction;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 Service1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();System.out.println("请求被接收");out.flush();out.close();}}
步骤二、建立一个Android项目(主页文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" ><Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/btn_connectionTest" android:onClick="myEvent" android:text="连接测试" /><Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/btn_getXML" android:onClick="myEvent" android:text="获取xml信息" /></LinearLayout>)
步骤三、Activity编写事件方法(代码如下)
package com.example.asynct;import java.net.HttpURLConnection;import java.net.URL;import android.os.AsyncTask;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void myEvent(View view) {switch (view.getId()) {case R.id.btn_connectionTest: new AsyncTask<String, Void, String>(){ @Overrideprotected void onPostExecute(String result) {Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();}@Overrideprotected void onProgressUpdate(Void... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);}//在后台要执行的操作,这个方法属于非UI@Overrideprotected String doInBackground(String... params) {String msg = null;try {URL url = new URL(params[0]);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");// 默认就是GETconn.setConnectTimeout(6000);if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {msg = "连接成功";}} catch (Exception e) {Log.e("tag", e.toString());StackTraceElement[] ste = e.getStackTrace();for (int i = 0; i < ste.length; i++) {Log.e("tag", ste[i].toString());}}return msg;}}.execute("http://10.0.2.2:8080/MyWebService/test1.do");break;}}}
源码下载请点击这里:
更多相关文章
- 【Android(安卓)界面效果43】Android(安卓)LayoutInflater的infl
- Android(安卓)编码规范 | 代码风格指南
- Android(安卓)Cavans 基础应用
- RemoteViews 中暗藏的坑
- Android中简单实现夜间模式
- Appium(七):Appium API(一) 应用操作
- android设置中的Preferencescreen使用方法介绍与分析
- 【Android】支持https接口调用的简单证书校验
- Android(安卓)H5混合开发 JS调用原生方法