2012-01-10 46 views
0

我已经在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应用程序。任何帮助将非常感激。

SOLUTION

感谢您的帮助大家。它正在工作。

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); 

     } 
    }); 

回答

0

我真的会推荐使用Handler而不是Thread。实际上不鼓励使用Thread.sleep方法。像这样的东西要好得多:

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

的问题是,你需要在UI线程做修改UI上,和你的线程的run()方法中,你是在一个“后台”线程。在需要访问UI线程时,尝试在线程内使用处理程序。

相关问题