从Android上的ProgressDialog中的新线程访问自定义类

时间:2012-01-10 19:31:25

标签: android progressdialog

我在android中创建了一个ProgressDialog,当我做一个简单的例子时它就可以工作了。

例如,这可行。

public void onClick(View v) 
{
    // Perform action on click
    System.out.println("Progess Bar");
    final ProgressDialog myProgressDialog = ProgressDialog.show(AndroidTestApplicationActivity.this,
                    "Please wait...", "Getting updates...", true);

    new Thread() 
    {
            public void run() 
            {
                    try
                    {
                            // Do some Fake-Work
                            sleep(5000);
                    } 
                    catch (Exception e) 
                    { 

                    }

                    // Dismiss the Dialog
                    myProgressDialog.dismiss();
            }
    }.start();

}

但是一旦我添加了对我的自定义类的引用,它就会停止运行这个新线程。

    button1.setOnClickListener(new View.OnClickListener() 
{
    public void onClick(View v) 
    {
        // Perform action on click
        System.out.println("Progess Bar");
        // Display an indeterminate Progress-Dialog
        final ProgressDialog myProgressDialog = ProgressDialog.show(AndroidTestApplicationActivity.this,
                        "Please wait...", "Getting Updates...", true);

        new Thread() 
        {
                public void run() 
                {
                        try
                        {
                                HealthySubObject hsObject = new HealthySubObject();
                                // Do some more work with my hsObject - nothing happens after this point. 
                                sleep(5000);
                        } 
                        catch (Exception e) 
                        { 

                        }

                        // Dismiss the Dialog
                        myProgressDialog.dismiss();
                }
        }.start();

    }
});

当我点击此按钮时,进度对话框会立即在屏幕上快速闪烁,然后消失。但是,如果你看看我的代码,它应该等待5秒才消失。我已经在我的自定义类的引用之前和之后放了调试语句,我可以看到之前的语句而不是之后的语句。有谁知道为什么会这样?只要我的课程是公开的,我就可以从新的主题中调用它,对吧?

我仍然是Android的新手,这是我第一次进入多线程Android应用程序。任何帮助将非常感激。

感谢大家的帮助。它现在正在运作。

    button1.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) 
        {
            // Perform action on click
            System.out.println("Progess Bar");
            //ProgressDialog dialog = ProgressDialog.show(AndroidTestApplicationActivity.this, "", "Loading. Please wait...", true);
            // Display an indeterminate Progress-Dialog
            final ProgressDialog myProgressDialog = ProgressDialog.show(AndroidTestApplicationActivity.this,
                            "Please wait...", "Doing Extreme Calculations...", true);

            Handler handler = new Handler();
            handler.postDelayed(new Runnable() 
            {
                @Override
                public void run() 
                {
                    HealthySubObject hsObject = new HealthySubObject();
                    ArrayList<HashMap<String, String>> onlineDB = hsObject.jsonToArray(); 
                    //
                    // more stuff goes here.  
                    //
                    //
                    myProgressDialog.dismiss();
                }
            }, 1500);

        }
    });

2 个答案:

答案 0 :(得分:0)

我真的建议使用Handler而不是Thread。实际上不鼓励使用Thread.sleep方法。这样的事情要好得多:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        HealthySubObject hsObject = new HealthySubObject();
        myProgressDialog.dismiss();
    }
}, 5000);

答案 1 :(得分:0)

问题是您需要在UI线程上修改UI,并且在Thread的run()方法中,您处于“后台”线程中。当您需要访问UI线程时,请尝试在线程内部使用处理程序。

相关问题