知识点:异步任务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)代码如下
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;}}}



源码下载请点击这里:

更多相关文章

  1. 【Android(安卓)界面效果43】Android(安卓)LayoutInflater的infl
  2. Android(安卓)编码规范 | 代码风格指南
  3. Android(安卓)Cavans 基础应用
  4. RemoteViews 中暗藏的坑
  5. Android中简单实现夜间模式
  6. Appium(七):Appium API(一) 应用操作
  7. android设置中的Preferencescreen使用方法介绍与分析
  8. 【Android】支持https接口调用的简单证书校验
  9. Android(安卓)H5混合开发 JS调用原生方法

随机推荐

  1. Android中ViewBinding遇到的坑
  2. [置顶] Android, ListView IllegalStateE
  3. Android开发技术周报 Issue#23
  4. Android中ViewHolder的使用
  5. Android(安卓)Market 链接的生成与分享
  6. Create new Android Virtual Device时不
  7. Android开发从入门到精通(7) _5
  8. Android中应用程序获得系统签名权限
  9. Android SDK 安装及常见问题解决
  10. Android 数据存储之 SQLit