创建一个新工程LearnAsyncTask,一个空Activity,上面放置几个控件 |
控件 |
属性 |
功能描述 |
EditText |
id="@+id/etUri" text="http://www.sina.com.cn" |
|
Button |
text="读取http数据" |
|
ScrollView |
|
由于读取的内容可能很长,会好几页,所有用此包裹TextView |
TextView |
id="@+id/tvRead" |
|
<
|
本程序介绍:AsyncTask 的用法,包括传入参数、设定后台任务doInBackground、过程信息的处理(publishProgress方法和onProgressUpdate事件)等 AsyncTask
第一个参数:是传入的对象(用户对AsyncTask进行初始化的一些数据),第二个参数:处理的过程中返回值的数据类型;第三个参数:返回结果的数据类型 构成函数的第一个参数会传给doInBackground的params的第一个数据 只可以execute一次,执行多次就报异常
|
可能需要重写的方法和事件
|
|
|
doInBackground
|
不要手工调用
该方法中调用的publishProgress()中传入的数据类型与AsyncTask的第二个参数类型必须一致,否则会报错。也与onProgressUpdate的参数一致
|
|
onCancelled
|
终止操作(本实例中不做讲解,有空再讲解哦) |
|
onCancelled(String s)
|
终止操作(本实例中不做讲解,有空再讲解哦)
|
|
onPostExecute
|
不要手工调用,AsyncTask执行之后会调用该事件 |
|
onPreExecute
|
不要手工调用,AsyncTask执行之前会调用该事件 |
|
onProgressUpdate
|
执行任务的过程中,用于对外发布当前执行任务的进度。参数与声明AsyncTask的第二个参数一致 |
|
|
|
|
public class MainActivity extends AppCompatActivity { private TextView tvRead; private EditText etUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvRead= (TextView) findViewById(R.id.tvRead); etUri= (EditText) findViewById(R.id.etUri); findViewById(R.id.btnRead).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new ReadHttpAsyncTask().execute(etUri.getText().toString()); } }); } //读取http数据的方法 private class ReadHttpAsyncTask extends AsyncTask<String, Integer, String> { @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onCancelled(String s) { super.onCancelled(s); } @Override protected void onPostExecute(String s) { tvRead.setText(s); super.onPostExecute(s); } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); setTitle("已经完成比例"+Integer.toString(values[0])); } //*doInBackground中不能直接操作UI。 @Override protected String doInBackground(String... params) { try { URL url = new URL(params[0]); URLConnection connection = url.openConnection(); int total=connection.getContentLength(); //获取要读取的内容总数量 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is,"utf-8"); BufferedReader br = new BufferedReader(isr); String line; StringBuilder stringBuilder=new StringBuilder(); while((line = br.readLine()) != null){ stringBuilder.append(line); System.out.println("===输出信息到Logcat:" + line); //注意publishProgress中传入的数据类型与AsyncTask的第二个参数类型必须一致,否则会保存 publishProgress(stringBuilder.toString().length()/total); } br.close(); isr.close(); is.close(); return stringBuilder.toString(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } }
|
|
|