0

我收到的错误是“不幸的是 XXXXXX 已停止”。onContinue 函数中可能有问题。

当进度条完成上传时,我希望他查看下一个布局 MainScreen.class

任何帮助将不胜感激。

这是我的代码:

public class MainActivity extends Activity {
protected static final int TIMER_RUNTIME = 10000; // in ms --> 10s

protected boolean mbActive;
protected ProgressBar mProgressBar;
@Override
public void onCreate(final Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.apploading);
  mProgressBar = (ProgressBar)findViewById(R.id.adprogress_progressBar);

  final Thread timerThread = new Thread() {
      @Override
      public void run() {
          mbActive = true;
          try {
              int waited = 0;
              while(mbActive && (waited < TIMER_RUNTIME)) {
                  sleep(200);
                  if(mbActive) {
                      waited += 200;
                      updateProgress(waited);
                  }
              }
      } catch(InterruptedException e) {
          // do nothing
      } finally {
          onContinue();
      }
    }
 };
 timerThread.start();
 }

 @Override
 public void onDestroy() {
   super.onDestroy();
 }
 public void updateProgress(final int timePassed) {
   if(null != mProgressBar) {
       // Ignore rounding error here
       final int progress = mProgressBar.getMax() * timePassed / TIMER_RUNTIME;
       mProgressBar.setProgress(progress);
   }
 }

 public void onContinue() {
 // Moved to the Application to the Main Screen
   Intent intent = new Intent(this, MainScreen.class);
   startActivity(intent);  

 }
}
4

2 回答 2

1

您正在 UI 线程中休眠,这将导致 ANR。我不确定您到底要做什么,但是如果您希望执行长时间运行的任务,请查看AsynctaskHandler

还可以在此处阅读有关保持应用程序响应和避免 ANRS 的信息。保持您的应用程序响应

默认情况下,Android 应用程序通常完全在单个线程上运行,即“UI 线程”或“主线程”)。这意味着您的应用程序在 UI 线程中执行的任何需要很长时间才能完成的操作都可能触发 ANR 对话框,因为您的应用程序没有给自己机会来处理输入事件或意图广播。

因此,在 UI 线程中运行的任何方法都应该在该线程上做尽可能少的工作。特别是,活动应该尽可能少地设置关键生命周期方法,例如 onCreate() 和 onResume()。可能长时间运行的操作(例如网络或数据库操作)或计算量大的计算(例如调整位图大小)应该在工作线程中完成(或者在数据库操作的情况下,通过异步请求)。

于 2013-06-01T13:58:25.790 回答
0
updateProgress(waited);

无法在您的 timerThread 上执行。所有修改 UI 的操作都必须在 UI Thread 上执行。使用处理程序或 runOnTheUiThread

final finalWaited = waited;
runOnUiThread(new Runnable() {
            public void run() {
               updateProgress(finalWaited);   
            }
        });
于 2013-06-01T13:58:06.017 回答