<dl id="1pdzy"></dl>

    1. <li id="1pdzy"></li>

    2. 当前位置: 移动互联网学院 > Android开发 > Android 中AsyncTask实现
      Android 中AsyncTask实现 时间£º2017-11-17     来源£º移动互联网学院

          在日常的开发过程中£¬Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行£¬当一个程序第一次启动时£¬Android会同时启动一个对应的主线程£¨Main Thread£©£¬主线程主要负责处理与UI相关的事件£¬如£º用户的按键事件£¬用户接触屏幕的事件以及屏幕绘图事件£¬并把相关的事件分发到对应的组件进行处理£¬如果在非UI线程中直接操作UI线程£¬会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views£¬由于UI线程负责事件的监听和绘图£¬因此£¬必须保证UI线程能够随时响应用户的需求£¬UI线程里的操作应该向中断事件那样短小£¬费时的操作£¨如网络连接£©需要另开线程£¬否则£¬如果UI线程超过5s没有响应用户请求£¬会弹出对话框提醒用户终止应用程序¡£如果在新开的线程中需要对UI进行设定£¬就可能违反单线程模型£¬常常会通过异步任务AsyncTask的方式?#27425;?#25252;单线程模型¡£AsyncTask对线程间的通讯做了包装£¬是后台线程和UI线程可以简易通讯£º后台线程执行异步任务£¬将结果告知Android UI线程¡£我们需要在耗时间的地方使用?#36828;?#20041;的AsyncTask¡£

      首先£¬继承AsyncTask<Params,Progress,Result>

                参数说明如下£º

      Params标示输入参数¡£

      Progress标示子线程执行的百分比¡£

      Result标示返回值类型¡£

                根据需求实现如下方法£º

      onPreExecute()方法¡£

      doInBackground(Params... params)方法¡£

      publishProgress(Params... params)方法¡£

      onProgressUpdate(Params... values)方法¡£

      onPostExecute(Params... params)方法¡£

          通过excute(Params... params)执行异步任务¡£其次£¬要注意AsyncTask要在Android 的UI线程创建£¬异步任务的execute()方法必须在Android的UI 线程中调用£¬且异步任务只能被执行一次£¬不需要手动调用onPreExecute(), onPostExecute()£¬doInBackground() onProgressUpdate()方法¡£

      实例代码£º

      AsyncTask子类LoadPicAsyncTask完成网络数据下载功能£º

      创建LoadPicAsyncTask对象:

      LoadPicAsyncTask p = new LoadPicAsyncTask(ImageView控件对象);

      执行LoadPicAsyncTask异步任务£º

      p.execute(网络资源url资源定位符);

      实现LoadPicAsyncTask内部类£º

      class LoadPicAsyncTask extends AsyncTask<String, Void, Void> {

      //辅助控件引用变量

      public ImageView mImageView;

      public Bitmap bitmap;

        //实现异步任务LoadPicAsyncTask构造器£º

      public LoadPicAsyncTask(ImageView imageView) {

      mImageView = imageView;

      }

      //实现异步任务的doInBackground£¨£©方法£¬形参列表是String类型

      protected Void doInBackground(String... arg0) {

      try {

      //获得形参内容£º

      String url = arg0[0];

      //创建网络Http访问客户端£º

      HttpClient client = new DefaultHttpClient();

      //创建Post请求对象

      HttpPost post = new HttpPost(url);

      //客户端发送Post网络请求

      HttpResponse response = client.execute(post);

      //获得服务器的返回值

      if (response.getStatusLine().getStatusCode() == 200) {

      //获得网络数据实体£º

      HttpEntity entity = response.getEntity();

      //获得网络数据的输入流对象

      InputStream is = entity.getContent();

      //读取网络数据流内容获得Bitmap对象

      bitmap = BitmapFactory.decodeStream(is);

      }

      } catch (MalformedURLException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      } catch (IOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

       

      return null;

      }

      //实现异步任务的onPostExecute方法£º

      protected void onPostExecute(Void result) {

      // TODO ?#36828;?#29983;成的方法存根

      super.onPostExecute(result);

      //显?#23601;?#32476;下载的内容£º

      mImageView.setImageBitmap(bitmap);

      }

       

      }

       

      }

      ¹Ù·½²ÊƱÓÐÄÄЩ

        <dl id="1pdzy"></dl>

        1. <li id="1pdzy"></li>

            <dl id="1pdzy"></dl>

            1. <li id="1pdzy"></li>