Tương tự như việc tải dữ liệu nhị phân ở trên, trong nhiều trường hợp ta cần tải dữ liệu dạng văn bản từ mạng (lấy dữ liệu từ các web service chẳng hạn). Ta cũng sẽ thực hiện thao tác này trong thread riêng, sử dụng AsyncTask và trả ra dữ liệu dạng String trước khi hiển thị lên màn hình (dạng Toast).
Đoạn mã tải và hiển dữ liệu văn bản trong thread riêng như sau:
private String DownloadText(String URL)
{ int BUFFER_SIZE = 2000; InputStream in = null; try { in = OpenHttpConnection(URL); } catch (IOException e) {
Log.d("NetworkingActivity", e.getLocalizedMessage()); return "";
}
InputStreamReader isr = new InputStreamReader(in); int charRead;
String str = "";
char[] inputBuffer = new char[BUFFER_SIZE]; try {
while ((charRead = isr.read(inputBuffer))>0) { //---convert the chars to a String---
String readString =
String.copyValueOf(inputBuffer, 0, charRead); str += readString;
inputBuffer = new char[BUFFER_SIZE]; }
in.close();
} catch (IOException e) {
Log.d("NetworkingActivity", e.getLocalizedMessage()); return "";
}
return str; }
private class DownloadTextTask extends AsyncTask<String, Void, String>
{
protected String doInBackground(String... urls) { return DownloadText(urls[0]);
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
} }
Đoạn mã trên chỉ khác với việc tải ảnh trong phần trước ở phần đọc dữ liệu từ luồng nhập liệu trả về. Trong trường hợp dữ liệu văn bản, ta dùng lớp InputStreamReader và hàm read của nó để dọc lần lượt dữ liệu dạng char ra, sau đó gắn thêm dần vào string kết quả.
Cuối cùng ta chỉ cần gọi AsyncTask mới tạo ra này trong hàm onCreate của Activity để xem kết quả:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); //---download text--- new DownloadTextTask().execute( "http://iheartquotes.com/api/v1/random?max_characters=256&max_lin es=10"); }
Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang
148