多线程的功能:减少堵塞,
处理机制: 过通知机制通知用户使用的活动(activity);在后台线程中处理耗时的操作
1.新建一个线程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | new Thread() { // 创建线程 public void run() { try { while (true) { sleep(1000); System.out.println(">>>>>>>TISK"); } } catch (InterruptedException e) { e.printStackTrace(); } }; }.start(); |
有三个返回值分别是
传递的数据类型 返回值数据类型
返回结果的数据类型
new AsyncTask<String, Float, String>() {// 初始化数据
方法 doInBackground 主要执行后台的操作,与UI的交互,要交给回调函数
onPostExecute 当执行完doback自动执行,参数为都
doInBackground的返回值
onPreExecute 进行doInBackground方法时,调用的方法 返回值为第三个
onProgressUpdate
执行过程中对外发布执行的的进度 返回值为第二个
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | public void ReadURL(String url) { /** * 当后台运行耗时操作时,主线程ui不受影响..和UI的互动中,要使用下面几个回调方法 */ new AsyncTask<String, Float, String>() {// 初始化数据 传递的数据类型 返回值数据类型 // 返回结果的数据类型 // 只能涉及和UI没关系的操作 protected String doInBackground(String... argo) { // 执行后台的耗时操作 try { URL url = new URL(argo[0]); // 从第一个数值读取 URLConnection connection = url.openConnection(); long total = connection.getContentLength();// 获取当前读取对象的全部长度 InputStream iStream = connection.getInputStream();// 获得InputStream对象 InputStreamReader isr = new InputStreamReader(iStream);// 创建InputStreamReader一层层包转起来 BufferedReader br = new BufferedReader(isr); String line; // 存放的一行信息 StringBuilder builder = new StringBuilder();// 存放连接的数据 while ((line = br.readLine()) != null) { builder.append(line); publishProgress((float) builder.toString().length() / total);// 获取过程中的百分比进度条 } System.out.println(builder.toString()); br.close(); iStream.close(); return builder.toString(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } protected void onCancelled() { super.onCancelled(); } protected void onCancelled(String result) { super.onCancelled(result); } /** * 当doInBackground方法结束后,自动调用该方法 */ protected void onPostExecute(String result) {// result就是doInBackground的返回值 System.err.println(result); text.setText(result); super.onPostExecute(result); } /** * 进行doInBackground方法时,调用的方法 */ protected void onPreExecute() { Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_LONG) .show(); super.onPreExecute(); } /** * 执行过程中对外发布执行的的进度 */ protected void onProgressUpdate(Float... values) { System.err.println(values[0]); super.onProgressUpdate(values); } }.execute(url);// 执行方法 传入的参数 } |