public class userlistactivity extends ListActivity {

    Context ct = null ;
    
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        ct = this ;        new ConnectThread().start();
     }
       
    }
        
     
public class ConnectThread extends Thread{ public void run(){

pd = new ProgressDialog(ct);
pd.setMessage("连接成功 ,正在获取玩家名单");
ProgressDialog pd = new ProgressDialog(ct); pd.show();
}}
问题  : 我想 在 线程 ConnectThread 中 弹出 一个 ProgressDialog  , 但 崩溃 了 ,应该 是 ProgressDialog  的 参数 错误, 请 
大家帮 我 修改到可以运行 , 必须是 在 线程中 弹出这个 ProgressDialog , 尽量只修改 context 参数 ,让小弟好好明白
context 是什么 ~我 是 android 新手 , 大家 顺便帮 我 解释一下 context 有什么 用 , android 是怎么用它的~ 谢谢 

解决方案 »

  1.   

    貌似线程里是不能弹出Dialog的~在主线程里才行context 指上下文,应用程序的运行环境~ 我大概理解成容器、全局存储信息的空间、类似文件夹这样的概念~ - -
      

  2.   

    ProgressDialog 只能放在线程外面,线程用来做数据处理。可以用个handler处理线程里的消息~
      

  3.   

    我在 oncreate 函数 保存了 this 指针 在 ct ,在用 ct 作参数。为什么还是崩溃。我想知道 详细原因,不只是行或不行。谢谢
      

  4.   

    没人知道吗。再顶。。 android 论坛 应该潜龙卧虎阿!
      

  5.   


    更不更新没关系,我想知道context 到底是啥 ,  要传什么给 progressdialog  ,还有 , userlistactivity.this 是什么 。 类的this ? 还是实例的this ? 
      

  6.   

    可以弹 不过估计会比较麻烦
    你参考一下Android的IME吧
      

  7.   

    呵呵。看的我可以满足你的需求么。private void Validation() {
    pd = new ProgressDialog(context);
    pd.setTitle("正在验证数据...");
    pd.setMessage("请稍后...");
    pd.show();
    new Thread(new ValidationToMeetAndKey(Id, Key, context, handler))
    .start();
    }package com.ppmeet.thread;import com.ppmeet.http.HttpManerger;import android.content.Context;
    import android.os.Handler;
    import android.os.Message;/**
     * class name:ValidationToMeetAndKey<BR>
     * class description:Validation meeting id and key <BR>
     * PS:发送数据到服务器去验证是否存在的会议id和key值并取得返回值。<BR>
     * 
     * @version 1.00 2011/09/29
     * @author CODYY)peijiangping
     */
    public class ValidationToMeetAndKey implements Runnable {
    private HttpManerger hm;
    private String Id;
    private String Key;
    private Context context;
    private Handler handler; /*
     * (non-Javadoc)
     * 
     * @see java.lang.Runnable#run()
     */
    public ValidationToMeetAndKey(String id, String key, Context context,
    Handler handler) {
    hm = new HttpManerger();
    this.Key = key;
    this.Id = id;
    this.context = context;
    this.handler = handler;
    } @Override
    public void run() {
    System.out.println("线程开始");
    Message message = new Message();
    String result = hm.intermessage(Id, Key, context);
    message.what=1;
    if (result.equals("yes")) {
    message.what=1; } else if (result.equals("no")) {
    message.what=0;
    }
    handler.sendMessage(message);
    }}[code=Java]
    //用来接收验证会议id和key值线程的消息,并对界面的处理。
    public Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
    super.handleMessage(msg);
    if (msg.what == YES) {
    Intent intent = new Intent(context, Live.class);
    // Bundle bundle = new Bundle();
    // bundle.putString("MeetID", Id);
    // bundle.putString("Key", Key);
    // intent.putExtras(bundle);
    context.startActivity(intent);
    } else if (msg.what == NO) {
    ToastUtil toastUtil = new ToastUtil(context);
    toastUtil.showDefultToast("会议数据错误!!").show();
    }
    pd.cancel();
    }
    };[/code]
      

  8.   

    我想在 自键线程中 弹出 progressdialog , 主要是为了了解一些 android 的 机制,  但也 谢谢上面的代码
      

  9.   

    context 我的理解是当前的Activity
      

  10.   

    userlistactivity.this 指的是当前对象,也就是userlistactivity类的实例!
      

  11.   

    progressdialog 只能在主线程中弹出,因为你progressdialog 的界面是显示在activity界面上的。当然是属于主线程。你要再其他线程中去操作主线程,sorry,no.
      

  12.   

    正确答案如下,注释完整:
    public class Main extends Activity {
    private Button btn_alert; Handler handler;//更新UI的handler
    AlertDialog aDialog;//要弹出的Dialog
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();
    btn_alert.setOnClickListener(new btn_alert_OnClickListener()); } private void init() {
    btn_alert = (Button) findViewById(R.id.btn_alert);
    handler=new myHandler();
    }
    /**
     * 多线程中弹出Alert
     */
    private class btn_alert_OnClickListener implements OnClickListener {
    @Override
    public void onClick(View v) {
    Thread thread = new Thread(runnable);
    thread.start();
    }
    };

    Runnable runnable = new Runnable() {
    @Override
    public void run() {
    //要传递的消息,可以捆绑线程中的数据进行发送
    Message message=new Message();
    message.arg1=100;
    handler.sendMessage(message);
    }
    };
    //继承了Handler类,用myHandler的对象来更新UI
    private class myHandler extends Handler{
    @Override
    public void handleMessage(Message msg) {
    aDialog=new AlertDialog.Builder(Main.this).setTitle("多线程弹出").setMessage("主线程中的数据:msg.arg1="+msg.arg1)
    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
    }).show();
    super.handleMessage(msg);
    }
    }
    }
      

  13.   

    除了上面我那种方法,只能是AsyncTask异步调用了,不过那还复杂一些。
    然后你就没有办法在线程中弹出Alert了
      

  14.   

    上面的方法弹出dialog的还是主线程。只是新建线程通知了主线程去弹。
    我个人一直是认为只能在主线程创建UI的,楼主非常认定别的线程也可以~一同期待下是否确实可以。
      

  15.   

    我个人理解 context是当前控件所在的activity 或者 service 
      

  16.   

    我没看过 android 的源码 , 但我想 ,主线程能更新UI ,是因为 主线程 含有更新UI 的代码,只不过没有显示出来, 我想找到这段代码, 加以更改应该能在自创线程更新UI , 不知道对不对
      

  17.   

    android只能在主线程更新ui啊  建议你看下View.postInvalidate();
    里面的解释是这样的 Cause an invalidate to happen on a subsequent cycle through the event loop.
        Use this to invalidate the View from a non-UI thread.这种方法是在非主线程通知主线程更新的
      

  18.   

    我还真没听说过能在其他线程更新UI界面的。
    我劝楼主还是不要白费力气了,它就是这样设计的,你没有任何办法来改变。因为android里面认为在其他线程对UI的操作是不安全的,所以设计了Handler来更新UI。
      

  19.   

    没看过源码,猜测你最可能做的是自己实现一个Context,让getMainLooper返回你线程的Looper...
      

  20.   

    我觉得应该在主线程中弹出dialog,android的控件是线程安全的,是不允许在另外的线程中访问UI线程中的控件的
      

  21.   

    我明明做出来了。何来不看源码? 我只想证明一点,什么android 规定UI 线程更新界面? 简直放屁的说话。什么规定?windows 规定应用程序没有ring0 权限, 还不一堆人在ring0跑自己的病毒??我有源码我还做不出自己的线程去更新界面??  
      

  22.   

    context就是当前Activity界面,它是一个容器,也就是说progressdialo要在这个Activity界面显示,userlistactivity.this就是指这个Activity了