一回の微信の小さいプログラムを覚えてアンドロイドの白いスクリーンの問題になります


このため、アンドロイドの携帯電話でウィジェットを使用する場合、ウィジェットをバックグラウンドに入れてしばらく運転した後、再びウィジェットに入った後、ページの白い画面が表示されたり、クリックが無効になったりしたことを記録します.

1.関連コードファイル


ここではカスタムコンポーネントの形式でレンダリングします.
  • 外部の参照カスタムコンポーネントのwxmlファイル
  • /* limitCommodity     ,        ,      、      、      */
    
        
    
  • カスタムコンポーネントのjsファイル
  • Component({
      properties: {
        goods: Object
      },
      data: {
      },
      timer: null,
      /*                ,      */
      attached: function() {
        if(this.timer) {
          clearInterval(this.timer);
        }
        this.filterTime();
        let that = this;    
        this.timer = setInterval(function () {
          that.filterTime();
        }, 1000)
      },
      /*                  ,       */
      detached: function() {
        clearInterval(this.timer);
        this.timer = null;
      },
      methods: {
        /*                   */
        filterTime() {
          let totalTime = new Date(parseInt(this.data.goods.endtime) * 1000) - new Date();
          let days = parseInt(totalTime / 1000 / 60 / 60 / 24, 10);
          let hours = parseInt(totalTime / 1000 / 60 / 60 % 24, 10);
          let minutes = parseInt(totalTime / 1000 / 60 % 60, 10);
          let seconds = parseInt(totalTime / 1000 % 60, 10);
          let day = days >= 10 ? days : '0' + days;
          day = day == 0 ? '' : day + ' ';
          let hour = hours >= 10 ? hours : '0' + hours;
          let minute = minutes >= 10 ? minutes : '0' + minutes;
          let second = seconds >= 10 ? seconds : '0' + seconds;
          this.setData({
            limitTime: day + hour + ":" + minute + ":" + second
          })
        },
      }
    })

    2.原因

  • 外部にカスタムコンポーネントが導入すると、そのままタイマが呼び出されてsetData操作が行うため、外部でこのコンポーネントを参照する際に、入力商品の配列長が大きいとタイマが増加するとともにsetData操作も増加する
  • となる.
  • setDataが多いとメモリ消費量が多くなる
  • 3.改善方法


    改善策はsetData操作を減らすことです
  • は、配列全体を
  • に伝達するためのコンポーネントをさらにカスタマイズすることができる.
  • それから商品の配列の中の時間に対して先に
  • を計算します
  • 改良jsファイル
  • Component({
      properties: {
        limitCommodity:Array
      },
      data: {
      },
      timeOut:null,
      /*                 */
      attached(){
        this.calculate();
      },
      /*                  ,       */
      detached(){
        clearTimeout(this.timeOut);
        this.timeOut = null;
      },
      methods: {
        filterTime(endtime) {
          let totalTime = new Date(parseInt(endtime) * 1000) - new Date();
          let days = parseInt(totalTime / 1000 / 60 / 60 / 24, 10);
          let hours = parseInt(totalTime / 1000 / 60 / 60 % 24, 10);
          let minutes = parseInt(totalTime / 1000 / 60 % 60, 10);
          let seconds = parseInt(totalTime / 1000 % 60, 10);
          let day = days >= 10 ? days : '0' + days;
          day = day == 0 ? '' : day + ' ';
          let hour = hours >= 10 ? hours : '0' + hours;
          let minute = minutes >= 10 ? minutes : '0' + minutes;
          let second = seconds >= 10 ? seconds : '0' + seconds;
          return day + hour + ":" + minute + ":" + second
        },
        calculate(){
          let limitCommodity = this.data.limitCommodity;
          for (let i = 0; i < limitCommodity.length;i++){
            limitCommodity[i]['endtime_date'] = this.filterTime(limitCommodity[i]['endtime'])
          }
          this.setData({
            limitCommodity
          })
          this.timeOut = setTimeout(()=>{
            this.calculate();
          },1000);
        }
      }
    })
  • の改良は、時間を計算する後の戻り時間であり、setDataは商品リスト全体の配列であり、setData回数
  • を減少させる.