2011-03-21 98 views
1

我在应用程序的背景中有一个线程解析XML。就像这样,它通过Handler更新活动视图中的进度条。这可以正常工作,直到手机改变方向(并且可能在其他破坏性操作期间,例如多任务处理,尽管我没有经过全面测试)。进行任意数量的旋转后,进度条会冻结它的位置并且永远不会前进,即使解析完成并且我的ListView自身更新也很好。线程处理程序停止处理方向更改

下面是相关代码的简化版本。我没有在这里包括它,但我确实有代码来确保线程在旋转之后继续不受阻碍 - 就像我所说的那样,解析最终会在相同的时间内完成并更新ListView。这只是进度条处理程序不工作:

private ProgressBar mProgress; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.directory_list); 
    mProgress = (ProgressBar) findViewById(R.id.progressBar); 
    mProgress.setMax(entryCount); 
    startXMLParseThread(); 
} 

private void startXMLParseThread() { 
    new Thread() { 
      Handler hUpdateProgressBar = new Handler(){ 
        public void handleMessage(Message msg) { 
      mProgress.setProgress(entryCount); 
        } 
      }; 

      public void run() { 
        while (parserEvent != XmlPullParser.END_DOCUMENT) { 
          entryCount++; 
          hUpdateProgressBar.sendEmptyMessage(0); 
          parserEvent = parser.next(); 
        } 

        mHandler.post(new Runnable() { 
          public void run() { 
             adapter.getCursor().requery(); 
          } 
       }); 
      } 
    }.start();  
} 
+0

请参阅http://stackoverflow.com/questions/1111980/how-to-handle-screen-orientation-change-when-progress-dialog-and-background-threa和http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is - 任何100个工作 – bigstones 2011-03-21 20:12:25

回答

1

可能是其再次运行onCreate方法与方向的变化......所以它失去参考以往处理......试试这个..add属性该特定活动中的清单文件android:configChanges =“orientation”...以这种方式,它不会再运行onCreate ...给它一个镜头...

+0

感谢您的建议。我已经尝试过了,但我再次尝试过,但不幸的是没有任何变化。酒吧仍然卡住。编辑:啊,等等!我把它放在清单中的错误位置。把它放在'活动'之后,它现在就像我想要的那样工作。谢谢! 不过,我希望我不会因为不采用“Android方式”做事而陷入困境。 Google建议不要重新创建视图方向更改?或者只有当您针对不同的方向使用不同的布局时才适用? – LouieGeetoo 2011-03-21 20:53:41

+1

是的,他们这样做。如果您确实知道正确处理方向更改,则只应使用此方法。一种不同的方式是将自己的引用传递给'onRetainNonConfigurationInstance'中的'Thread',然后使用'getLastNonConfigurationInstance'获取'onCreate'中的引用,并检查它是否为空(在这种情况下,现有任务将运行不会启动一个)。你确实想在每次调用'onCreate'的时候设置处理器,尽管在你的线程中添加了一个'setHandler'方法并且替换了现有的处理器。 – 2011-03-21 21:26:44

+0

它似乎按原样工作,但如果遇到任何麻烦,我会回来试试你的建议。非常感谢您提供的信息丰富的评论! – LouieGeetoo 2011-03-23 02:51:24