簡體   English   中英

在一定時間段后改變活動

[英]change activity after a certain time period

我正在創建可以在一段時間后更改活動的應用程序,但是我無法使其正常運行。 當我運行程序時,我只會看到黑屏。 這是我的onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
activity = 1;
     i = new Intent(context, WeatherActivity.class);
    Handler mHandler = new Handler();
    mHandler.postDelayed(new Runnable() {

        @Override
        public void run() {
            while (true){
             if(activity ==1){
                 context.startActivity(i);
                 activity = 0;
             }else if (activity ==0){
                 news();

                 activity = 1;
             } try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }


        }

    }, 10000L);
}

活動只是帶有一些文本的簡單活動。 如有需要,我會發布它們。 編輯:通過改變方法的活動使其起作用。

您缺少setContentView

super.onCreate(savedInstanceState);
setContentView(R.layout.your_xml_name);

校驗

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_xml_name);
context = this;
activity = 1;

檢查啟動畫面

要同時完成任務,可以使用AlarmManager。

    Intent intent = new Intent("com.foo.android.MY_TIMER");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
    long now = System.currentTimeMillis();
    long interval = 60 * 60 * 1000; // 1 hour
    manager.setRepeating(AlarmManager.RTC_WAKEUP, now + interval, interval,
        pendingIntent); // Schedule timer for one hour from now and ev

然后將BroadcastReceiver擴展添加到您的活動中。

公共類YourActivity擴展了BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
     // your task

}

}

RegisterReceiver您的BroadcastReceiver @Override受保護的void onResume(){super.onResume(); mIntentFilter = new IntentFilter(“ com.foo.android.MY_TIMER”); registerReceiver(mReciever,mIntentFilter); }

記住要在onDestroy方法中運行它:

@Override
protected void onDestroy() {
  super.onDestroy();
  unregisterReceiver(receiver);
}

好吧,我想您的問題是您正在主線程中執行無限循環,它將永遠不會有機會繪制新的活動布局。

一個可能的解決方案是使用此處描述的AsyncTask

本質上,它允許您在后台執行長時間運行的任務,並在准備好結果后將結果發布到主線程上。

class MyAsyncTask extends AsyncTask<Integer, Void, Void> { 
     private Context context;

     public MyAsyncTask(Context c) { context = c; }

     public void doInBackground(Integer... milliseconds) {
          try {
              for(int i = 0; i < milliseconds.length; ++i)
                  Thread.sleep(milliseconds[i]);
          } catch (InterruptedException e) {
                e.printStackTrace();
          }
     }

     public void onPostExecute(Void result) {
         Intent intent = new Intent(context, WeatherActivity.class);
         context.startActivity(intent);
     }
}

現在,您只需實例化並在所需的位置執行它:

new MyAyncTask(context).execute(100000);

您還可以使用AsyncTask做更復雜的事情,例如使用publishProgressonProgressUpdate發布中間結果(有關更多信息,請參見文檔),這只是一個基本示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM