进度对话和线程

时间:2012-07-24 15:13:03

标签: android multithreading

我的目标是Android 4.0,并且正在使用TCP / IP与遥测设备进行通信。 Android 4.0强制所有网络都在一个单独的线程中完成。首先我打开一个套接字,然后我联系设备并从一个单独的线程下载所有信息。此时我想显示进度拨号以显示下载更详细信息的进度。我的问题是,除了主UI之外,我无法从任何地方显示进度对话框。但是,我不知道何时我已经准备好显示进度对话框的另一个线程。有没有什么方法可以在不占用系统的情况下从主界面检查这个?

3 个答案:

答案 0 :(得分:1)

使用Handler,就像那样:

final int PROGRESS_BY = 1;

    final Handler handler = new Handler()
    {
        public void handleMessage(android.os.Message msg) 
        {
            switch (msg.what)
            {
                case PROGRESS_BY :
                    progressBar.setProgress((Integer) msg.obj);
                    break;
            }
        }
    };

    Thread thread = new Thread()
    {
        @Override
        public void run() 
        {
            super.run();
            // do something
            Message msg = new Message();
            msg.what = PROGRESS_BY;
            msg.obj = new Integer(10);
            handler.sendMessage(msg);
            // do something
            [...]
        }
    };

答案 1 :(得分:1)

AsyncTask是框架提供的实用程序,适用于您描述的情况。 从另一个线程,即执行异步任务的线程,您可以使用AsyncTask的publishProgress()方法发布进度。它是异步的并且在不同的线程上运行但是具有在主线程上运行的事件回调。 OnProgressUpdate()是可以使用进度对话框的方法。

http://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

要在主ui上触发对话框,您需要使用'context.runOnUiThread()',其中context是对您的显示活动的引用。使用AsyncTask也值得研究。

这是一篇Android博客文章,详细解释了所有内容:http://android-developers.blogspot.ca/2009/05/painless-threading.html

另外,您也可以从一开始就开始显示不确定的进度对话框,因此用户永远不会在没有视觉反馈的情况下等待,然后在您知道下载详细信息时切换到确定。