当前位置:   article > 正文

AsyncTask多线程_asynctask改成多线程

asynctask改成多线程
  1. package com.example.qing.asynctaskexample;
  2. import android.os.AsyncTask;
  3. import android.preference.Preference;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.ProgressBar;
  9. import android.widget.TextView;
  10. import android.widget.Toast;
  11. public class MainActivity extends AppCompatActivity {
  12. // 线程变量
  13. MyTask mTask;
  14. // 主布局中的UI组件
  15. Button button,cancel; // 加载、取消按钮
  16. TextView text; // 更新的UI组件
  17. ProgressBar progressBar; // 进度条
  18. /**
  19. * 步骤1:创建AsyncTask子类
  20. * 注:
  21. * a. 继承AsyncTask类
  22. * b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替
  23. * 此处指定为:输入参数 = String类型、执行进度 = Integer类型、执行结果 = String类型
  24. * c. 根据需求,在AsyncTask子类内实现核心方法
  25. */
  26. private class MyTask extends AsyncTask<String, Integer, String> {
  27. // 方法1:onPreExecute()
  28. // 作用:执行 线程任务前的操作
  29. @Override
  30. protected void onPreExecute() {
  31. text.setText("加载中");
  32. // 执行前显示提示
  33. }
  34. // 方法2:doInBackground()
  35. // 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
  36. // 此处通过计算从而模拟“加载进度”的情况
  37. @Override
  38. protected String doInBackground(String... params) {
  39. try {
  40. int count = 0;
  41. int length = 1;
  42. while (count<99) {
  43. count += length;
  44. // 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
  45. publishProgress(count,20); //...可以传递多个参数
  46. // 模拟耗时任务
  47. Thread.sleep(50);
  48. }
  49. }catch (InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52. return null;
  53. }
  54. // 方法3:onProgressUpdate()
  55. // 作用:在主线程 显示线程任务执行的进度
  56. @Override
  57. protected void onProgressUpdate(Integer... progresses) {
  58. progressBar.setProgress(progresses[0]); //可以传递多个参数
  59. text.setText("loading..." + progresses[0] + "%"+progresses[1]);
  60. // Toast.makeText(MainActivity.this,progresses[1],Toast.LENGTH_LONG).show();
  61. }
  62. // 方法4:onPostExecute()
  63. // 作用:接收线程任务执行结果、将执行结果显示到UI组件
  64. @Override
  65. protected void onPostExecute(String result) {
  66. // 执行完毕后,则更新UI
  67. text.setText("加载完毕");
  68. }
  69. // 方法5:onCancelled()
  70. // 作用:将异步任务设置为:取消状态
  71. @Override
  72. protected void onCancelled() {
  73. text.setText("已取消");
  74. progressBar.setProgress(0);
  75. }
  76. }
  77. @Override
  78. protected void onCreate(Bundle savedInstanceState) {
  79. super.onCreate(savedInstanceState);
  80. // 绑定UI组件
  81. setContentView(R.layout.activity_main);
  82. button = (Button) findViewById(R.id.button);
  83. cancel = (Button) findViewById(R.id.cancel);
  84. text = (TextView) findViewById(R.id.text);
  85. progressBar = (ProgressBar) findViewById(R.id.progress_bar);
  86. /**
  87. * 步骤2:创建AsyncTask子类的实例对象(即 任务实例)
  88. * 注:AsyncTask子类的实例必须在UI线程中创建
  89. */
  90. mTask = new MyTask();
  91. // 加载按钮按按下时,则启动AsyncTask
  92. // 任务完成后更新TextView的文本
  93. button.setOnClickListener(new View.OnClickListener() {
  94. @Override
  95. public void onClick(View v) {
  96. /**
  97. * 步骤3:手动调用execute(Params... params) 从而执行异步线程任务
  98. * 注:
  99. * a. 必须在UI线程中调用
  100. * b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
  101. * c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()
  102. * d. 不能手动调用上述方法
  103. */
  104. mTask.execute();
  105. }
  106. });
  107. cancel = (Button) findViewById(R.id.cancel);
  108. cancel.setOnClickListener(new View.OnClickListener() {
  109. @Override
  110. public void onClick(View v) {
  111. // 取消一个正在执行的任务,onCancelled方法将会被调用
  112. mTask.cancel(true);
  113. }
  114. });
  115. }
  116. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:gravity="center"
  7. tools:context="com.example.carson_ho.handler_learning.MainActivity">
  8. <Button
  9. android:layout_centerInParent="true"
  10. android:id="@+id/button"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:text="点我加载"/>
  14. <TextView
  15. android:id="@+id/text"
  16. android:layout_below="@+id/button"
  17. android:layout_centerInParent="true"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="还没开始加载!" />
  21. <ProgressBar
  22. android:layout_below="@+id/text"
  23. android:id="@+id/progress_bar"
  24. android:layout_width="fill_parent"
  25. android:layout_height="wrap_content"
  26. android:progress="0"
  27. android:max="100"
  28. style="?android:attr/progressBarStyleHorizontal"/>
  29. <Button
  30. android:layout_below="@+id/progress_bar"
  31. android:layout_centerInParent="true"
  32. android:id="@+id/cancel"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:text="cancel"/>
  36. </RelativeLayout>

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/279593
推荐阅读
相关标签
  

闽ICP备14008679号