使用 Android 和 XML 构建动态用户界面(11)
 
- UID
- 1066743
|

使用 Android 和 XML 构建动态用户界面(11)
首先,您设置 android.os.Handler 类的一个实例。当应用程序需要与不同的线程共享数据时,Handler 类可以派上用场。SubmitForm() 方法中需要注意的另一个重要项目是 ProgressDialog。注意,ProgressDialog 和 Handler 被定义为类级变量,如 所示。
清单 14. ProgressDialog 和 Handler1
2
3
4
5
6
7
8
| public class RunForm extends Activity {
/** Called when the activity is first created. */
String tag = RunForm.class.getName();
XmlGuiForm theForm;
ProgressDialog progressDialog;
Handler progressHandler;
...
}
|
您肯定不想在与服务器通信时不必要地阻塞应用程序,因此您部署了一个后台 Thread 来通信,但您依赖这个 Handler 来从通信线程接收通知,以便向用户提供反馈。注意,只有主线程被视为与用户界面交互。这个独立线程方法的一个替代方法是 android.os 包中的 AsyncTask 类。
当应用程序连接到服务器以传输数据时,它有机会通知用户操作的状态,这当然是一种好实践。 展示了运行中的 ProgressDialog。
图 14.ProgressDialog 实际服务器通信代码位于 中的 TransmitFormData() 类中,该类实现 Runnable 界面。
清单 15. TransmitFormData 类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| private class TransmitFormData implements Runnable
{
XmlGuiForm _form;
Message msg;
TransmitFormData(XmlGuiForm form) {
this._form = form;
}
public void run() {
try {
msg = new Message();
msg.what = 0;
msg.obj = ("Connecting to Server");
progressHandler.sendMessage(msg);
URL url = new URL(_form.getSubmitTo());
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
BufferedOutputStream wr = new BufferedOutputStream
(conn.getOutputStream());
String data = _form.getFormEncodedData();
wr.write(data.getBytes());
wr.flush();
wr.close();
msg = new Message();
msg.what = 0;
msg.obj = ("Data Sent");
progressHandler.sendMessage(msg);
// Get the response
BufferedReader rd = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line = "";
Boolean bSuccess = false;
while ((line = rd.readLine()) != null) {
if (line.indexOf("SUCCESS") != -1) {
bSuccess = true;
}
// Process line...
Log.v(tag, line);
}
wr.close();
rd.close();
if (bSuccess) {
msg = new Message();
msg.what = 0;
msg.obj = ("Form Submitted Successfully");
progressHandler.sendMessage(msg);
msg = new Message();
msg.what = 1;
progressHandler.sendMessage(msg);
return;
}
} catch (Exception e) {
Log.d(tag, "Failed to send form data: " + e.getMessage());
msg = new Message();
msg.what = 0;
msg.obj = ("Error Sending Form Data");
progressHandler.sendMessage(msg);
}
msg = new Message();
msg.what = 2;
progressHandler.sendMessage(msg);
}
}
|
|
|
|
|
|
|