Android Thread和AsyncTask
1. 线程Thread
2. 异步任务AsyncTask
-------------------------------------------------
-------------------------------------------------
1. 线程Thread
在APK开启后,就会有一个主线程,负责与用户交互。如果在主线程中执行了耗时操作,那么界面就会停止响应,所以要将耗时操作转移到别的线程中
2. 异步任务AsyncTask
耗时任务不能再UI主线程中执行,异步任务使用AsyncTask
AsyncTask<String, Float, String>
//第一个参数String代表传入参数
//第二个参数Float代表 执行过程中的数值
//第三个参数String 代表返回值
下面是一个读取网页操作的demo
① 布局文件: 点击button,将获取到的内容放在TextView中显示
<Button android:id="@+id/btnRead" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/read_website" /> <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </ScrollView>
② 定义AsyncTask
在 doInBackground 中不能调用UI控件进行操作
对UI控件的操作必须在其他几个回调函数中执行:onCancelled,onCancelled(),onPostExecute, onPreExecute, onProgressUpdate
public void readUrl(String url) { new AsyncTask<String, Float, String>() { //第一个参数String代表传入参数 //第二个参数Float代表 执行过程中的数值 //第三个参数String 代表返回值 @Override protected String doInBackground(String... params) { // 在后台运行 try { URL url = new URL(params[0]); URLConnection conn = url.openConnection(); long total = conn.getContentLength(); // 要读取的内容总长度 InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); float values = builder.toString().length() / total; publishProgress(values); // 对应onProgressUpdate, 对外发布进度 } br.close(); isr.close(); is.close(); return builder.toString(); //对应onPostExecute } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } @Override protected void onCancelled(String result) { // TODO Auto-generated method stub super.onCancelled(result); } @Override protected void onPostExecute(String result) { // 当前的Async执行完毕后会回调它 tv1.setText(result); super.onPostExecute(result); } @Override protected void onPreExecute() { // 当前的Async执行完毕前会回调它 Toast.makeText(getApplicationContext(), "start Read", Toast.LENGTH_SHORT).show(); super.onPreExecute(); } @Override protected void onProgressUpdate(Float... values) { // 在执行任务的过程中对外发布执行的进度 Log.d("CARLOZ", "values = " + values[0]); super.onProgressUpdate(values); } }.execute(url); }
③ 调用AsyncTask
TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv1 = (TextView) findViewById(R.id.textView1); findViewById(R.id.btnRead).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { readUrl("http://carloz.duapp.com"); } }); }
结果如下: