Board logo

标题: 使用 Android 和 XML 构建动态用户界面(11) [打印本页]

作者: look_w    时间: 2018-9-19 20:27     标题: 使用 Android 和 XML 构建动态用户界面(11)

首先,您设置 android.os.Handler 类的一个实例。当应用程序需要与不同的线程共享数据时,Handler 类可以派上用场。SubmitForm() 方法中需要注意的另一个重要项目是 ProgressDialog。注意,ProgressDialog 和 Handler 被定义为类级变量,如  所示。
清单 14. ProgressDialog 和 Handler
1
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);
}

}






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0