ITEEDU

AsyncTask 使用示例

从网上获取一个网页,在一个TextView中将其源代码显示出来 。下载过程中有进度条显示进度。

public class AndroidtestActivity extends Activity {
	private TextView message;
	private Button open;
	private EditText url;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.network);
		message = (TextView) findViewById(R.id.message);
		url = (EditText) findViewById(R.id.url);
		open = (Button) findViewById(R.id.open);
		open.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				connect();
			}
		});

	}

	private void connect() {
		PageTask task = new PageTask(this);
		task.execute(url.getText().toString());
	}

	class PageTask extends AsyncTask<String, Integer, String> {
		// 可变长的输入参数,与AsyncTask.exucute()对应
		ProgressDialog pdialog;

		public PageTask(Context context) {
			pdialog = new ProgressDialog(context, 0);
			pdialog.setButton("cancel", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int i) {
					dialog.cancel();
				}
			});
			pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
				public void onCancel(DialogInterface dialog) {
					finish();
				}
			});
			pdialog.setCancelable(true);
			pdialog.setMax(100);
			pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			pdialog.show();
		}

		@Override
		protected String doInBackground(String... params) {
			try {
				HttpClient client = new DefaultHttpClient();
				// params[0]代表连接的url
				HttpGet get = new HttpGet(params[0]);
				HttpResponse response = client.execute(get);
				HttpEntity entity = response.getEntity();
				long length = entity.getContentLength();
				InputStream is = entity.getContent();
				String s = null;
				if (is != null) {
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
					byte[] buf = new byte[128];
					int ch = -1;
					int count = 0;
					while ((ch = is.read(buf)) != -1) {
						baos.write(buf, 0, ch);
						count += ch;
						if (length > 0) {
							// 如果知道响应的长度,调用publishProgress()更新进度
							publishProgress((int) ((count / (float) length) * 100));
						}
						// 让线程休眠100ms
						Thread.sleep(100);
					}
					s = new String(baos.toByteArray());
				}
				// 返回结果
				return s;
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}

		@Override
		protected void onCancelled() {
			super.onCancelled();
		}

		@Override
		protected void onPostExecute(String result) {
			// 返回HTML页面的内容
			message.setText(result);
			pdialog.dismiss();
		}

		@Override
		protected void onPreExecute() {
			// 任务启动,可以在这里显示一个对话框,这里简单处理
			message.setText("任务形始");
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			// 更新进度
			System.out.println("" + values[0]);
			message.setText("" + values[0]);
			pdialog.setProgress(values[0]);
		}

	}

}