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 が発生します。何をしようとしているのか正確にはわかりませんが、長時間実行されるタスクを実行したい場合は、AsynctaskまたはHandlerをご覧ください。

アプリケーションの応答性を維持し、ANRS を回避する方法については、こちらもお読みください。アプリの応答性を維持する

通常、Android アプリケーションは、デフォルトでは単一のスレッド (「UI スレッド」または「メイン スレッド」) で完全に実行されます。これは、アプリケーションが入力イベントまたはインテント ブロードキャストを処理する機会を自分自身に与えていないため、完了するまでに時間がかかる UI スレッドでアプリケーションが行っていることはすべて、ANR ダイアログをトリガーする可能性があることを意味します。

したがって、UI スレッドで実行されるすべてのメソッドは、そのスレッドでできるだけ少ない作業を行う必要があります。特に、アクティビティは、onCreate() や onResume() などの主要なライフサイクル メソッドで設定することをできるだけ少なくする必要があります。ネットワークやデータベース操作などの潜在的に長時間実行される操作、またはビットマップのサイズ変更などの計算コストの高い計算は、ワーカー スレッドで (データベース操作の場合は非同期要求を介して) 実行する必要があります。

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

timerThread では実行できません。UI を変更するすべての操作は、UI スレッドで実行する必要があります。Handler または runOnTheUiThread を使用する

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