①在子线程中直接ProgressDialog progressDialog = ProgressDialog.show(context, "","正在访问网络,请稍...",false,true);为什么可以在主UI中显示,我并没有用Handler。
②为什么子线程中可以控制ProgressDialog的显示,也没有用handler

解决方案 »

  1.   


    new thread(){
      public void run(
    //
    )
    }
      

  2.   

    public static void httpGet(final Context context, final String url,
    final Handler handler) {
    new Thread() {
    ProgressDialog progressDialog = ProgressDialog.show(context, "",
    "正在访问网络,请稍后...", false, true);
    public void run() {
    String string = null;
    HttpClient httpClient = new DefaultHttpClient();
    httpClient.getParams().setIntParameter(
    HttpConnectionParams.CONNECTION_TIMEOUT, 1000 * 10);// 连接超时
    httpClient.getParams().setIntParameter(
    HttpConnectionParams.SO_TIMEOUT, 1000 * 10);// socket超时
    HttpGet httpGet = new HttpGet(url);
    try {
    HttpResponse httpResponse = httpClient.execute(httpGet);
    if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    string = EntityUtils.toString(httpResponse.getEntity(),
    "utf-8");
    } else {
    toast(context, "服务端响应错误,错误码:"
    + httpResponse.getStatusLine().getStatusCode(),
    handler);
    }
    } catch (Exception e) {
    toast(context, "网络错误", handler);
    e.printStackTrace();
    }
    if (progressDialog != null && progressDialog.isShowing()) {
    progressDialog.dismiss();
    }
    if (handler != null) {
    handler.sendMessage(handler.obtainMessage(10, string));
    }
    }
    }.start();
    }
      

  3.   

    呵呵,我知道你的疑惑了,你要看看dialog的代码,dialog是直接new 了 一个view,然后调用了windowmanager的addview方法,他有自己的phonewindow, viewroothandler,所以可以显示的。
      

  4.   

    这个是dialog里面的一句话
    mUiThread = Thread.currentThread();
      

  5.   

    源码看不懂...
    ProgressDialog在子线程是显示不了的这个应该没错
    但是子线程为什么可以控制主线程中ProgressDialog的显示呢
      

  6.   

    这个dialog是在子线程中create的,他的uiThread就是创建它的那个Thread, 可能是主线程,也可能不是。
      

  7.   

    主线程无非是ActivitiThread启动的时候,自己搞了一个thread loop,然后管理android的四大组建的客户端。