本人有个项目 需要在请求网络的时候显示等待对话框,等响应完成后在消失,我想大家能明白,现在我的难点就是不知道怎么去写 请求网络的代码写好了 如下
          public static String getJSONString() throws Exception {
String path = "http://192.168.0.66:8080/javawebs/findlist";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setReadTimeout(5 * 1000);
conn.setRequestMethod("POST");
if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");
InputStream inStream = conn.getInputStream();
byte[] data = StreamTool.readInputStream(inStream);
json = new String(data);
return json;
}
然后在Activity中的onCreate方法中有个按钮事件去请求网络,我想在点击这个按钮后如果网络延时过大会显示这个等待对话,等加载完成后子关闭他,这个要怎么写  onCreate里的按钮事件如下
             down.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
RecordJson.getJSONString();
rb = RecordJson.getRecord();
topictext.setText(rb.getTopic());
topictext.startAnimation(animation);
} catch (Exception e) {
downToast();
}
}
});

解决方案 »

  1.   


    public void loading(String msg){
    if(msg!=null){
    load_dialog.setTitle(msg);
    }else{
    load_dialog.setTitle("请等待...");
    }
    load_dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    load_dialog.show();
    }

    public void done(){
    if(load_dialog!=null){
    load_dialog.dismiss();
    }

    调用 // 更新
    Button refresh = (Button)findViewById(R.id.btn_refresh);
    refresh.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    loading("正在获取最新动态.");
    if(!isNetworkAvailable(FeedActivity.this)){
    return;
    }
    Message msg = new Message();
    msg.what = DataService.FEED_UPDATE;
    DataService._handler.sendMessage(msg); // 因为我的数据读取为非UI线程,所以done方法自已找地方放了。
    }
    });
    另外,android的Dialog是异步的,不是模态阻塞的窗口,所以,在设备比较差的机器上,显示窗口都是一瞬间,我也暂时没找到方法流泪。
      

  2.   

    请求网络时:
    1.显示等待对话框
    ProgressDialog Dialog = SearchpProgressDialog = ProgressDialog.show(LoginActivity."xxx","xxx",true);//
    2。启动线程请求网络
    new Thread(new GetSerListThread()).start();//开启线程请求网络
    class GetSerListThread extends Thread{
    @Override
    public void run() {
    super.run();
    //请求网络代码网络的代码
                             //请求完毕使用handler更新主线程
    e.printStackTrace();
    Message msg = new Message();
    msg.what = 1;
    handler.sendMessage(msg); // 向Handler发送超时消息,更新UI

    }

    }
    Handler handler = new Handler() {
    public void handleMessage(Message m) {
    switch (m.what) {
    // 处理UI更新等操作
    case ID_USER:
                                    //等待对话框dismiss
    if(Dialog != null){
    Dialog.dismiss();
    }
    break;
               }
      

  3.   

    谢谢以上两位的回答!我想问下tangfei_honesty,请求网络是在线程里做吗?
      

  4.   

    用AsyncTask代替handler会不会容易点?
      

  5.   

    down.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
          //点击按钮时显示等待框,然后开启线程下载
          1.显示等待对话框
          ProgressDialog Dialog = SearchpProgressDialog =              ProgressDialog.show(LoginActivity."xxx","xxx",true);//
    2。启动线程请求网络,
    new Thread(new GetSerListThread()).start();
    });/开启线程请求网络
    class GetSerListThread extends Thread{
    @Override
    public void run() {
    super.run();
    //请求网络代码网络的代码
      //请求完毕使用handler更新主线程
    RecordJson.getJSONString();
    rb = RecordJson.getRecord();
    Message msg = new Message();
    msg.what = 1;
    handler.sendMessage(msg); // 向Handler发送消息,更新UI}//使用handler更新UI
    Handler handler = new Handler() {
    public void handleMessage(Message m) {
    switch (m.what) {
    // 处理UI更新等操作
    case ID_USER:
      //等待对话框dismiss
    if(Dialog != null){
    Dialog.dismiss();
    topictext.setText(rb.getTopic());
    topictext.startAnimation(animation);
    }
    break;
      }

    }步骤就是点击显示等待框,同时多线程开始请求网络,请求网络结束后,用handler更新UI(关闭等待对话框和设置TextView的值)