2012-01-07 79 views
4

这里是我的代码,进度对话框使用与主题

public ProgressDialog loadingdialog; 
public void ShowManager() { 
    //do something 
} 
public void startScan() { 
     loadingdialog = ProgressDialog.show(WifiManagementActivity.this, 
               "","Scanning Please Wait",true); 
     new Thread() { 
      public void run() { 
       try { 
        sleep(4000); 
        ShowManager(); 

       } catch(Exception e) { 
        Log.e("threadmessage",e.getMessage()); 
       } 
       loadingdialog.dismiss(); 
      } 
     }.start(); 
    } 

startScan(); 

基本progressdialog播放功能,但其中ShowManager()被调用行,得到错误,

01-07 23:11:36.081: ERROR/threadmessage(576): Only the original thread 
that created a view hierarchy can touch its views. 

编辑:

ShowManager()是一个更改视图元素的函数。有点像,

public void ShowManager() 
    { 
     TextView mainText = (TextView) findViewById(R.id.wifiText); 
     mainText.setText("editted"); 

    } 

回答

13

我找到了答案。我不喜欢回答我自己的问题,但this可能会帮助别人。我们无法在单独的线程中更新大多数UI对象。我们必须创建一个处理程序并更新其中的视图。

public ProgressDialog loadingdialog; 
    private Handler handler = new Handler() { 
      @Override 
       public void handleMessage(Message msg) { 
       loadingdialog.dismiss(); 
       ShowManager(); 

      } 
     }; 
    public void ShowManager() 
    { 
     TextView mainText = (TextView) findViewById(R.id.wifiText); 
     mainText.setText("editted"); 
    } 
    public void startScan() { 
     loadingdialog = ProgressDialog.show(WifiManagementActivity.this, 
              "","Scanning Please Wait",true); 
     new Thread() { 
      public void run() { 
       try { 
        sleep(4000); 
        handler.sendEmptyMessage(0); 

       } catch(Exception e) { 
        Log.e("threadmessage",e.getMessage()); 
       } 
      } 
     }.start(); 
    } 

    startScan(); 
0

这是因为你正试图从线程中消除对话框,而它是在主UI线程中创建的。尝试在线程内移动ProgressDialog.show声明。我宁愿使用的AsyncTask,因为它们更易于管理在本example

+0

progressdialog正在工作,我收到错误的行,我打电话给showmanager()。 – ocanal 2012-01-08 00:03:03

+0

所以发布showmanager的代码 – nandeesh 2012-01-08 00:05:12

+1

@nandeesh我编辑了它。 – ocanal 2012-01-08 00:13:26

4

使用这个,而不是仅仅loadingdialog.dismiss()

runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 
     loadingdialog.dismiss(); 
    } 
}); 
+0

我对显示和解除progressdialog没有任何问题,这是工作,我得到showmanager()函数的错误。 – ocanal 2012-01-08 00:01:36

+0

所以,而不是在上面的答案加载dialog.dismiss放showmanager(),应该工作 – nandeesh 2012-01-08 00:19:21

0

像这样它的“OK”:

public void startScan() { 
    new Thread() { 
     public void run() { 
    loadingdialog = ProgressDialog.show(WifiManagementActivity.this, 
              "","Scanning Please Wait",true); 
      try { 
       sleep(4000); 
       ShowManager(); 

      } catch(Exception e) { 
       Log.e("threadmessage",e.getMessage()); 
      } 
      loadingdialog.dismiss(); 
     } 
    }.start(); 
} 

请注意ProgressDialog.show(...)的位置,此处dialog.dismiss()在创建对话框的线程中调用。 但最简洁的方式来达到它的使用AsynTask