React-native: Tambahkan dukungan untuk AlarmManager di Timing untuk memungkinkan penanganan pengatur waktu yang lama dengan tepat

Dibuat pada 16 Mar 2017  ·  173Komentar  ·  Sumber: facebook/react-native

Mengatur timer untuk beberapa menit tidak ditangani dengan benar di React Native di Android: ini membuat modul Timing tetap aktif alih-alih mengandalkan sistem yang membangunkan kita saat timer harus mati.

Kita harus mengeksplorasi pengaturan cut off di mana kita mendelegasikan ke AlarmManager dan Handler.postDelayed alih-alih menangani pengatur waktu menggunakan framecallbacks.

Bug JavaScript Android

Komentar yang paling membantu

@ Skv-headless Opinion masuk. :)

Menurut saya, sikap terhadap masalah perlu disingkirkan. Saya telah melihatnya lebih sering muncul dan itu menyebabkan orang mengabaikan peringatan. Itu adalah peringatan. Mereka memperingatkan Anda. Jangan abaikan mereka, lakukan sesuatu. Saya telah melihat aplikasi yang semua peringatannya diabaikan, bahkan pemberitahuan penghentian. Kemudian aplikasi Anda rusak dan Anda bertanya-tanya mengapa.

Dalam kasus ini, Anda dapat mengonfigurasi batas waktu ini dan menurunkannya, atau menyiapkan pendekatan berbeda untuk menanganinya. Mungkin bahkan menyodok pengelola perpustakaan dan meminta mereka untuk membantu menemukan solusi.

Saran saya, ikuti utas ini sampai seseorang yang cerdas menemukan solusi yang sebenarnya, sehingga Anda kemudian dapat mendidik diri sendiri dengan jawaban itu. Dan mungkin, sementara itu (jika Anda tidak bisa / tidak ingin mengatasi masalah) abaikan peringatan.

TL; DR;

Ya, Anda dapat mengabaikan peringatan untuk sementara. Cukup periksa sesekali untuk melihat statusnya dan jika ada tindakan yang diperlukan.

Semua 173 komentar

Peningkatan yang luar biasa!

ini akan membantu dengan socket.io yang menyimpan timer 85000ms secara default. Pada master RN, ambang batasnya adalah 60000ms .

Dan Firebase yang juga menggunakan timer lama.

Saya mendapatkan peringatan berikut saat menggunakan pustaka firebase

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info. (Saw setTimeout with duration 111862ms)

Bagaimana cara menghilangkan peringatan ini ...

Saya juga mendapatkan peringatan berikut saat menggunakan pustaka firebase. Ada yang tahu bagaimana mengatasi masalah ini?

Saya juga mendapatkan peringatan ini dengan firebase.

"firebase": "^3.9.0",
"react-native": "0.44.0"

Masalah yang sama ( 85000ms ) tetapi tanpa firebase . Daftar paket saya:

  "dependencies": {
    "apisauce": "0.11.0",
    "format-json": "1.0.3",
    "lodash": "4.17.4",
    "markdown-it": "^8.3.1",
    "native-base": "^2.1.3",
    "normalizr": "^3.2.2",
    "prop-types": "^15.5.10",
    "querystringify": "1.0.0",
    "ramda": "0.23.0",
    "react": "16.0.0-alpha.6",
    "react-markdown": "^2.5.0",
    "react-native": "0.44.0",
    "react-native-animatable": "1.2.0",
    "react-native-config": "0.4.2",
    "react-native-device-info": "0.10.2",
    "react-native-drawer": "2.3.0",
    "react-native-htmlview": "0.9.0",
    "react-native-i18n": "1.0.0",
    "react-native-linear-gradient": "^2.0.0",
    "react-native-photo-view": "^1.2.0",
    "react-native-router-flux": "3.39.1",
    "react-native-scrollable-tab-view": "*",
    "react-native-share": "^1.0.20",
    "react-native-vector-icons": "4.1.1",
    "react-navigation": "^1.0.0-beta.9",
    "react-redux": "5.0.4",
    "redux": "3.6.0",
    "redux-persist": "4.6.0",
    "redux-saga": "0.15.3",
    "reduxsauce": "0.4.1",
    "seamless-immutable": "7.1.2"
  },
  "devDependencies": {
    "ava": "^0.18.2",
    "babel-eslint": "^7.1.1",
    "babel-preset-es2015": "^6.18.0",
    "enzyme": "^2.6.0",
    "husky": "^0.13.1",
    "ignite-animatable": "^0.3.1",
    "ignite-dev-screens": "^2.0.0-beta.9",
    "ignite-i18n": "^0.1.1",
    "ignite-ir-boilerplate-2016": "^0.2.2",
    "ignite-vector-icons": "^0.2.1",
    "mockery": "^2.0.0",
    "nyc": "^10.1.2",
    "react-addons-test-utils": "^15.3.1",
    "react-dom": "^15.4.0",
    "react-native-mock": "^0.3.1",
    "reactotron-apisauce": "^1.7.0",
    "reactotron-react-native": "^1.7.0",
    "reactotron-redux": "^1.7.0",
    "reactotron-redux-saga": "^1.7.0",
    "snazzy": "^6.0.0",
    "standard": "^8.6.0"
  }

Saya mengalami masalah serupa saat menggunakan 0.44.0 di Android. Saya juga tidak menggunakan firebase:

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info. (Saw setTimeout with duration 85000ms)

Hai teman-teman .. bertanya-tanya Apakah ada solusi cepat untuk ini. Saya menggunakan:

react-native 0.44 react 16.0.0-alpha.6 feathers-socketio 1.6.0

Ini sangat menjengkelkan saat saya sedang mengembangkannya .. adakah yang bisa saya sembunyikan untuk peringatan sekarang ??

Masalah yang sama di sini dengan firebase 3.9.0

Jika itu mengganggu Anda cukup menambahkan console.ignoredYellowBox = ['Setting a timer'];

@ Skv-headless Opinion masuk. :)

Menurut saya, sikap terhadap masalah perlu disingkirkan. Saya telah melihatnya lebih sering muncul dan itu menyebabkan orang mengabaikan peringatan. Itu adalah peringatan. Mereka memperingatkan Anda. Jangan abaikan mereka, lakukan sesuatu. Saya telah melihat aplikasi yang semua peringatannya diabaikan, bahkan pemberitahuan penghentian. Kemudian aplikasi Anda rusak dan Anda bertanya-tanya mengapa.

Dalam kasus ini, Anda dapat mengonfigurasi batas waktu ini dan menurunkannya, atau menyiapkan pendekatan berbeda untuk menanganinya. Mungkin bahkan menyodok pengelola perpustakaan dan meminta mereka untuk membantu menemukan solusi.

Saran saya, ikuti utas ini sampai seseorang yang cerdas menemukan solusi yang sebenarnya, sehingga Anda kemudian dapat mendidik diri sendiri dengan jawaban itu. Dan mungkin, sementara itu (jika Anda tidak bisa / tidak ingin mengatasi masalah) abaikan peringatan.

TL; DR;

Ya, Anda dapat mengabaikan peringatan untuk sementara. Cukup periksa sesekali untuk melihat statusnya dan jika ada tindakan yang diperlukan.

@imamatory saya pikir adalah oleh Rectotron

Saya pikir adalah dengan Rectotron

Jika demikian, peringatan ini dapat diabaikan begitu saja.
... namun emulator android saya terkadang lambat, mungkin itu salah satu alasannya.

@imamatory Saya harap solusi sebenarnya semudah ini

Hai, saya rasa saya menemukan solusinya:
Pertama, Anda harus menemukan file berikut dalam proyek Anda: libraries / Core / Timers / JSTimer; js
Buka dan Anda hanya perlu mengubah konstanta ini MAX_TIMER_DURATION_MS, untuk menambah durasi Anda, tulis di akhir peringatan!

@nicolasZZ hai, Terima kasih atas solusinya. tetapi apakah itu praktik yang baik untuk memodifikasi pustaka JSTimer daripada kode kita sendiri?

@nicolasZZ @AmroAly Dalam pikiran saya, solusi ini bukanlah praktik yang baik karena sangat tidak stabil, yang terbaik adalah mengabaikan peringatan saat solusi resmi dirilis.

console.ignoredYellowBox = [
    'Setting a timer'
]

solusi @ skv-headless bagus tetapi dalam kasus saya hanya bekerja dengan "enter" di antara tanda kurung

@rigobcastro Terima kasih karena menyembunyikan peringatan yang mengganggu.

@ DZuz14 akan luar biasa jika Anda bisa mengirim PR atau

hai ~
Saya menggunakan socket.io. nodejs and RN44 or RN 45
Saya melihat peringatan timer ini.

Saya menemukan solusi ini
reference reactotron PR

nodejs server pribadi dan scoket.io

const express = require('express')
const app = express()
const server = require('http').Server(app)
const io = require('socket.io')(server, {pingTimeout: 30000})

Terima kasih!

Saya memiliki proyek react native sederhana untuk android dan saya menggunakan firebase auth dengan react native untuk Login dan Signup, tetapi saya mendapat kesalahan kuning, Apa yang harus saya lakukan? Tautan Pertanyaan saya di stackoverslow (https://stackoverflow.com/questions/44603362/setting-a-timer-for-a-long-period-of-time-ie-multiple-minutes)

Terima Kasih @ DZuz14
Saya Mendapat Kesalahan Ini Saat saya menjalankan react-native run-android

D:\Projects 2016\Web\Android\mohajerkade-android\android\app\src\main\java\com\mohajerkade\AlarmManagerModule.java:40: error: cannot find symbol
       Intent intent = new Intent(context, AlarmReceiver.class);
                                           ^
  symbol:   class AlarmReceiver
  location: class AlarmManagerModule
1 error
:app:compileDebugJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

Saya ingin menggunakan firebase auth dengan react native untuk Login dan Signup tetapi saya mendapat kesalahan kuning itu,
1: Apa Sebenarnya Modul Ini?
2: Mengapa Proyek Saya membutuhkan Modul Ini?

Saya bertanya stackoverflow melalui tautan ini: (https://stackoverflow.com/questions/44603362/setting-a-timer-for-a-long-period-of-time-ie-multiple-minutes)
Saya Melaporkan ke Tim Google Firebase melalui tautan ini: (https://github.com/firebase/firebase-js-sdk/issues/97)

@ DZuz14 Saya mendapat pertanyaan yang sama dengan @saeedhei .

Pada dasarnya kita menggunakan modul node firebase yang menggunakan timer periode panjang ini.

Menambahkan modul Anda tidak cukup Saya kira, kita sebenarnya harus menulis ulang kode dalam modul node firebase untuk menggunakan Alarm Anda daripada pengatur waktu Javascript, bukan?

Terima kasih @ DZuz14

Jadi jika Anda melihat ke dalam paket npm yang disebut firebase Anda akan menemukan bahwa ia menggunakan setTimeout di banyak tempat. Ini tidak masalah karena pustaka ditulis untuk situs web dan server node.js. react-native adalah jenis server node.js tetapi berjalan di telepon - dan seperti yang ditunjukkan peringatan dengan benar - pengatur waktu Javascript yang berjalan lama tidak baik di lingkungan ini dan mungkin menguras baterai dan memiliki efek samping yang tidak diinginkan lainnya .

Jadi saya kira kita harus meyakinkan orang-orang Firebase untuk benar-benar mengubah pendekatan Anda dan mendistribusikan paket yang dibuat khusus untuk react-native .

@BerndWessels https://www.npmjs.com/package/react-native-firebase Pernahkah Anda melihat ini? Mengatakan itu memungkinkan firebase untuk berjalan di thread asli. Tidak yakin seberapa benar itu, tetapi mungkin menarik untuk dilihat. Anda bahkan mungkin menggunakan itu, saya tidak yakin.

@ DZuz14 Terima kasih, saya akan memeriksanya.

console.ignoredYellowBox = [
'Menyetel pengatur waktu'
]

@rigobcastro Di mana saya dapat memasukkan atau menempelkan kode ini?

@ Jazz747 Di bagian atas file setup Anda, misalnya app.js, index.android.js atau index.ios.js

console.ignoredYellowBox = [ 'Setting a timer' ]
Kode ini hanya menyembunyikan peringatan di dalam react native.

Bagaimana dengan peringatan di dalam konsol browser?

Adakah yang tahu jika seseorang dari tim RN atau komunitas sedang mengerjakan solusi untuk masalah ini?

Popup peringatan mengalihkan ke masalah ini tetapi saya tidak dapat menemukan solusi yang tepat di sini selain menyembunyikan peringatan, yang sama sekali bukan solusi. Ada ide atau saran?

@SuhairZain Semuanya tampaknya menunjukkan bahwa ada kesalahan pustaka eksternal ke RN

@rigobcastro Peringatan ini dapat dengan mudah direproduksi dengan panggilan setInterval() dengan waktu yang cukup lama (dalam kasus saya adalah 5 menit). Jadi menurut saya ini bukan sesuatu yang disebabkan oleh libs pihak ketiga.

BTW, saya telah menemukan perpustakaan di sini: react-native-background-timer yang membantu saya menyelesaikan pekerjaan.

@Suhair ya u benar! masalah saya adalah dengan lib pihak ketiga tetapi pemilik memperbaiki kesalahan (saya membayangkan mereka baru saja mengubah beberapa setInterval() ) dan peringatan itu menghilang.

Rekomendasi bagus, terima kasih.

saya punya masalah yang sama di sini. Dan masih tidak bisa mengerti bagaimana saya harus menangani masalah ini.

rn: 0.45.1
firebase: 4.1.3

@Escalepion yang terhormat, saya melaporkan ke tim firebase: (https://github.com/facebook/react-native/issues/12981#issuecomment-309595327)

@escalepion Jika masalah Anda adalah tentang menyetel pengatur waktu yang berjalan lama, lihat komentar saya di atas dan lihat apakah itu membantu Anda.

@ SuhairZain maaf saya tidak bisa mengerti bahwa bagaimana dapat menggunakan setInterval atau react-native-background-timer :( di mana dan bagaimana saya akan menulis kode? Apakah u punya contoh?

Adakah yang punya tip tentang bagaimana mencari tahu perpustakaan mana yang menyebabkan kerusakan? Saya baru saja mengupgrade RN menjadi 0.46 dan tiba-tiba error ini muncul. Saya memiliki beberapa perpustakaan dalam proyek saya dan saya hanya dapat memikirkan untuk menyelidikinya satu per satu, yang jelas tidak ideal.

Bersulang!

@ abeltje1 , jika Anda menemukan cara memperbaiki masalah ini, dapatkah Anda memperbarui di sini

@ liketurbo pasti saya akan

Saya mengalami masalah ini bersama dengan redux-saga untuk memvalidasi ulang token API setiap 30 menit.

Karenanya, dalam hal ini, menunggu selama ini sebenarnya benar. Dan saya rasa ada skenario lain yang menunggu lama.

Lalu pertanyaan saya adalah, mengapa ini peringatan? Apa yang bisa rusak / terjadi? Apakah saya tidak seharusnya dapat menggunakan LLT (transaksi jangka panjang)?

Jika LLT baik-baik saja. Apa pendekatan terbaik untuk menangani masalah ini? Memperluas waktu AlarmManager?

Terima kasih sebelumnya ;)

Saya mengalami masalah yang sama dengan @sospedra. Saya menggunakan redux-saga dan saya memiliki saga yang menyegarkan beberapa data di aplikasi di latar belakang setiap 3 menit, jadi saga tersebut menyertakan kode yield call(delay, 3 * 60000); . Akibatnya, saya mendapatkan kesalahan "Menyetel pengatur waktu untuk jangka waktu yang lama ...".

Saya juga bertanya-tanya pendekatan apa yang disarankan untuk sesuatu seperti ini. Masalah apa yang akan saya hadapi jika saya membiarkan kode saya berfungsi seperti ini. Pesan kesalahan menyiratkan bahwa mungkin ada masalah kinerja, dan mungkin pengatur waktu tidak benar-benar diaktifkan pada waktu yang tepat jika aplikasi berada di latar belakang?

Jika mungkin ada masalah dengan kode ini yang menyetel pengatur waktu 3 menit, solusi alternatif apa yang akan mencapai fungsi yang sama dan tidak mengalami masalah ini?

masih mendapatkan masalah yang sama.

Saya pikir, satu-satunya solusi adalah pindah ke Native Android Development

Masalahnya masih belum bisa diselesaikan? Ada yang menemukan solusinya?

Saya mendapatkan peringatan saat menggunakan firebase.

Jika masalahnya bukan dari pustaka pihak ketiga, tetapi dari Anda yang menyetel waktu tunggu yang lama, solusi yang baik adalah menggunakan pustaka react-native-background-timer . README ini juga berisi contoh sederhana.

Sayangnya , jika masalah berasal dari pustaka pihak ketiga, Anda mungkin tidak memiliki solusi selain menemukan tempat setTimeout dipanggil dan mengajukan masalah / mengirimkan PR untuk menggunakan pustaka yang disebutkan di atas , silakan coba solusi saya yang mungkin di bawah ini di https://github.com/facebook/react-native/issues/12981#issuecomment -331074444 dan coba apakah itu berhasil untuk Anda.

Tolong buat waktu istirahat yang bagus di android juga.

react-native-background-timer adalah solusi yang bagus seperti yang dikatakan @SuhairZain . ini dapat menghapus pesan peringatan

Saya mendapatkan peringatan ini saat menggunakan socket.io

karena socket.io memiliki timer 85ms

FWIW ini hanya terjadi pada saya ketika saya menggunakan Reactotron saat mengembangkan ...

Membuat saya gila untuk sementara waktu saya harus mengakui tetapi saya tahu saya tidak bisa mengabaikan pesan itu

Saya tidak lagi mengerjakan proyek yang memiliki masalah dengan ini, jadi saya tidak dapat benar-benar menguji apakah pendekatan ini berhasil, tetapi seharusnya, setidaknya dalam teori. Jika kesalahan berasal dari modul pihak ketiga yang menggunakan setTimeout atau setInterval dengan penundaan yang lama, ini seharusnya dapat memperbaiki masalah Anda. Apa yang dilakukannya adalah menambal setTimeout global dan setInterval untuk menggunakan react-native-background-timer sebagai gantinya:

import BackgroundTimer from 'react-native-background-timer';

setTimeout = BackgroundTimer.setTimeout;
setInterval = BackgroundTimer.setInterval;
clearTimeout = BackgroundTimer.clearTimeout;
clearInterval = BackgroundTimer.clearInterval;

Tulis kode ini di suatu tempat pada inisialisasi awal Anda, sebaiknya index.android.js atau index.ios.js sedini mungkin. Jika seseorang dapat menguji ini, itu akan sangat dihargai.

@SuhairZain :

setTimeout = BackgroundTimer.setTimeout.bind(BackgroundTimer)
setInterval = BackgroundTimer.setInterval.bind(BackgroundTimer)
clearTimeout = BackgroundTimer.clearTimeout.bind(BackgroundTimer)
clearInterval = BackgroundTimer.clearInterval.bind(BackgroundTimer)

@levity Saya menambahkan kode Anda ke app.js saya, tapi saya mengerti

undefined bukanlah sebuah objek (mengevaluasi 'RNBackgroundTimer.setTimeout')

@realtebo terdengar seperti Anda mungkin belum menyelesaikan instalasi react-native-background-timer seperti yang dijelaskan dalam README mereka dengan menjalankan react-native link atau menggunakan CocoaPods.

@levity : maksud Anda menjalankan react-native link ?

npm install -g react-native-cli
link react-native
Memindai folder untuk symlink di C: \ Users \ realtebo \ Downloads \ manager2 \ node_modules (54ms)
react-native link tidak dapat digunakan dalam proyek Create React Native App. Jika Anda perlu menyertakan pustaka yang bergantung pada kode bawaan khusus, Anda mungkin harus mengeluarkannya terlebih dahulu. Lihat https://github.com/react-community/create-react-native-app/blob/master/EJECTING.md untuk informasi lebih lanjut.

Saya tidak ingin mengeluarkan .... jadi, .. apa yang dapat saya lakukan?

Oh, maaf, saya tidak tahu bagaimana membantu Anda dengan proyek Create React Native App. Saya sendiri tidak pernah menggunakan itu.

Halo,
Saya mendapat beberapa masalah dengan react-native: ^0.49.3 ...

cf. https://github.com/ocetnik/react-native-background-timer/issues/65

Semoga Anda bisa membantu, terima kasih atas waktu Anda;)

Hai, Saya memiliki masalah yang sama saya menggunakan 0.49 , itu muncul setelah melakukan ini

export function saveUserData(userInfo){
  return (dispatch) => {
    dispatch(saveDataRequest())
    const userId = firebase.auth().currentUser.uid;
    return firebase.database().ref('users/' + userId).set(userInfo)
      .then(() => {
        dispatch(saveDataSuccess());
        dispatch(NavigationActions.navigate({ routeName: 'TabContactNavigation' }))
      })
      .catch((error) => {
        dispatch(saveDataFailure(error))
      });
  }
}

Di atas adalah Action dalam redux, yang juga menggunakan redux-thunk .. Saat tombol diklik untuk menyimpan data dari formulir ke firebase ketika penyimpanan berhasil, ia mengirimkan saveDataSuccess() dan kemudian arahkan ke tab berikutnya.
Sekarang saya mencurigai masalah yang muncul di sini const userId = firebase.auth().currentUser.uid tetapi saya tidak yakin. Berikut adalah tangkapan layar masalahnya. (aplikasinya berfungsi dengan baik tetapi peringatan ini muncul, saya tidak tahu apakah saya harus mengabaikannya) atau mungkin saya melakukan sesuatu yang salah di sini, butuh bantuan kalian, terima kasih

warning

warning2

hey, peringatannya tentang setTimeout, apakah Anda menggunakannya di komponen Anda?
dan ya, baris const userId = firebase.auth (). currentUser.uid; tidak berfungsi, itu adalah janji dan ketika Anda menggunakan userId itu masih tidak datang.
cara yang lebih baik untuk melakukannya adalah dengan mendapatkan userId dari actionCreator, Anda sudah mengirimkan variabel userInfo, coba ini:

saya akan berasumsi bahwa userInfo berasal dari firebase auth login, jadi Anda memiliki uid di dalamnya

fungsi ekspor saveUserData (userInfo) {
kembali (pengiriman) => {
pengiriman (saveDataRequest ())
// const userId = firebase.auth (). currentUser.uid;
return firebase.database (). ref ('users /' + userInfo.uid) .set (userInfo)
.then (() => {
pengiriman (saveDataSuccess ());
dispatch (NavigationActions.navigate ({routeName: 'TabContactNavigation'}))
})
.catch ((error) => {
pengiriman (saveDataFailure (error))
});
}
}
Saya harap ini bisa membantu, dan maaf untuk bahasa Inggris saya yang buruk = P

Kebahagiaan

El 23/10/2017, sampai 23:59, Yasir [email protected] escribió:

Hai, saya memiliki masalah yang sama dengan yang saya gunakan 0,49, itu muncul setelah melakukan ini

fungsi ekspor saveUserData (userInfo) {
kembali (pengiriman) => {
pengiriman (saveDataRequest ())
const userId = firebase.auth (). currentUser.uid;
return firebase.database (). ref ('users /' + userId) .set (userInfo)
.then (() => {
pengiriman (saveDataSuccess ());
dispatch (NavigationActions.navigate ({routeName: 'TabContactNavigation'}))
})
.catch ((error) => {
pengiriman (saveDataFailure (error))
});
}
}
Di atas adalah Action in redux, yang juga menggunakan redux-thunk .. Saat sebuah tombol diklik untuk menyimpan data dari formulir ke firebase saat penyimpanan berhasil, maka saveDataSuccess () akan dikirim dan kemudian arahkan ke tab berikutnya.
Sekarang saya mencurigai masalah yang muncul di sini const userId = firebase.auth (). CurrentUser.uid tetapi saya tidak yakin. Berikut adalah tangkapan layar masalahnya. (aplikasinya berfungsi dengan baik tetapi peringatan ini muncul, saya tidak tahu apakah saya harus mengabaikannya) atau mungkin saya melakukan sesuatu yang salah di sini, butuh bantuan kalian, terima kasih

https://user-images.githubusercontent.com/12644122/31925375-94b7c464-b89d-11e7-889d-e9d00866ff73.png
https://user-images.githubusercontent.com/12644122/31925386-9e9bf3c4-b89d-11e7-9eaa-65147879629f.png
-
Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub https://github.com/facebook/react-native/issues/12981#issuecomment-338874018 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ AHhM1oYWKrWSOZsm-8hjp4Q6qJSfqraUks5svW6-gaJpZM4Mf0Z0 .

Biasanya saya simpan ke toko redux di userinfo.
Jadi saya hanya menggunakan kembali sesuai kebutuhan.
... tapi ... dalam situasi yang sama, saya memiliki masalah yang sama persis dengan batas waktu

Masalah yang sama dengan pustaka react-native-signalr (300000ms)

opsi server socket.io
pingTimeout (60000) + pingInterval (25000) <= 60000

Adakah pembaruan tentang bagaimana kita harus menangani ini di Android? Masih mendapatkannya, juga tidak menggunakan setTimeout ...

Sekadar menindaklanjuti komentar saya pendekatan terbaik

cc @shergin @cpojer @javache @hramos

Perbaikan untuk react-native-signalr (ms-signalr-client) di Android adalah dengan mengganti pinginterval default (300000):
connection.start({ pingInterval: 5000, jsonp: true, transport: ['webSockets', 'serverSentEvents', 'longPolling']}).done(() => { console.log('Now connected, connection ID =' + connection.id) })

Masalah yang sama dengan react-native-pomelo (80000ms)

console.ignoredYellowBox = ['Setting a timer'];

Ini cukup aman sebagai solusi karena Anda masih akan mendapatkan peringatan di konsol chrome saat Anda melakukan debug dari jarak jauh

Di mana tepatnya tempat terbaik untuk meletakkan kode pengabaian konsol? '

- Nevermind, mendapat petunjuk dari terkait stackexchange , ditambahkan ke App.js saya sebagai berikut:

class App extends Component {
  constructor() {
    super();

    console.ignoredYellowBox = [
      'Setting a timer'
    ];
  }
...
}
````

and also tried in my index.js as <strong i="8">@haikyuu</strong> just recommended..

impor {AppRegistry} dari 'react-native';
impor Aplikasi dari './App';

console.ignoredYellowBox = [
'Menyetel pengatur waktu'
];

AppRegistry.registerComponent ('manager', () => App);
`` ''

bekerja di keduanya

@CopyJosh Anda dapat meletakkannya di file entri Anda: index.js

jadi belum ada solusi sebenarnya untuk ini? sudah lebih dari 8 bulan sekarang ..

?

Mari kita selesaikan ini. Kami mungkin harus mencari tahu:

A.) API mudah diperluas yang dapat dipanggil melalui kode React. Saya pikir akan bijaksana untuk menangani mungkin hanya salah satu metode AlarmManagers untuk bekerja. Misalnya, memanggil metode berikut dalam kode React Native Anda akan menyetel alarm dengan AlarmManager asli perangkat android.
AlarmMgr.setInexactRepeating(arg1, arg2...)

B.) Implementasi aktual untuk membuat ini bekerja. Sejauh yang saya tahu, menyetel alarm dengan AlarmManager mengirimkan apa yang disebut "niat tertunda" ke layanan AlarmManager. Anda memberi tahu AlarmManager bahwa Anda ingin menjalankan beberapa jenis "tugas" di masa mendatang. Menurut saya, Anda perlu meminta AlarmManager (atau Metode Java React kustom) mengirim beberapa jenis data kembali ke kode JavaScript Anda, memberi tahu kode apa yang harus dijalankan setelah alarm berbunyi.

Ada yang siap untuk mengatasi masalah ini? Selengkapnya bisa dibaca di AlarmManager di sini .

btw - apakah inefisiensi ini (terkait dengan waktu tunggu yang lama dan multi-menit) merupakan masalah baru hanya untuk versi RN> 0,43? Ataukah hanya peringatan yang dikeluarkan dari RN> 0,43? Saya bermigrasi dari 0.43.x ke 0.47.x dan mulai melihat peringatan. Saya berasumsi bahwa ketidakefisienan selalu ada, dan RN baru saja mulai memperingatkan saya tentang hal itu sekarang ..

namun, sejak migrasi beberapa hari yang lalu, saya juga memperhatikan bahwa aplikasi saya menghabiskan lebih banyak baterai di ponsel saya! (dan fitur lain dalam perbedaan bukanlah penyebab yang jelas)

Hai @astreet , apakah Anda mungkin masih ingat apa yang Anda maksud saat memposting masalah ini dan menambahkan peringatan ini di sini https://github.com/facebook/react-native/commit/3637bce479 ?

Baru-baru ini menjadi sangat menjengkelkan bagi saya setelah saya mulai menggunakan satu lib yang menyetel pengatur waktu berulang 2 menit jadi saya mulai menggalinya untuk memahami mengapa peringatan ini telah ditambahkan di tempat pertama.

Sekarang saya prihatin tentang kalimat ini: "membuat modul Timing tetap aktif". Apa yang saya pikir mungkin Anda maksud adalah modul Timer mengatur panggilan balik koreografer. Meskipun panggilan balik tampaknya diatur terlepas dari apakah kita memiliki pengatur waktu atau tidak. Lihat bagian kode yang relevan di sini: https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/ReactAndroid/src/main/java/com/facebook/react/modules/core/Timing.java#L106
Tidak ada kode untuk menghentikan panggilan balik ketika tidak ada pengatur waktu yang dijadwalkan dan tidak ada kode untuk memulai penjadwalan saat pengatur waktu ditambahkan. Callback hanya ditangguhkan saat aplikasi berpindah ke latar belakang dan dipulihkan saat dipindahkan kembali ke latar depan.

Akibatnya callback koreografer diantrekan untuk setiap frame terlepas dari apakah kita memiliki timer untuk jangka waktu lama, waktu singkat atau tidak ada timer sama sekali. Saya tidak melihat bagaimana menyetel pengatur waktu lama dapat memengaruhi kinerja dalam kasus itu. Jadi apakah itu berarti peringatan itu tidak perlu?

Sejauh menyetel pengatur waktu lama menjadi "masalah kebenaran", saya pikir Anda mengacu pada fakta bahwa pengatur waktu hanya akan dipanggil dalam status aplikasi latar depan (jadi ketika Anda menyetelnya untuk waktu yang lama di masa mendatang dan aplikasi menjadi bg itu tidak akan dijalankan, atau akan dijalankan saat aplikasi masuk ke latar depan yang mungkin jauh lebih lambat dari yang Anda harapkan). Meskipun saya yakin ini adalah kasus yang sama untuk iOS di mana kami tidak menampilkan peringatannya

Di socket.io loop ping default adalah 85000ms, = pingInterval (25000ms) + pingTimeout (60000ms). dan Anda harus mengatur ulang opsi tersebut di server dan memastikan jumlah pingInterval dan pingTimeout <= 60000ms.

sebagai contoh:

var socket = require('socket.io')(12345, {
  pingInterval: 20000, 
  pingTimeout: 40000
})

Hanya ingin tahu - Saya harus dapat menyetel waktu tunggu sekitar 5 menit di aplikasi saya. Seberapa serius masalah ini dan seberapa besar pengaruhnya terhadap saya?

@ntomallen Jika aplikasi akan selalu tampil di layar, maka tidak ada yang akan berubah. Ini akan bekerja dengan lancar. Jika tidak, mungkin itu tidak akan terpicu di akhir 5 menit. Atau itu akan dilakukan secara tidak tepat.

Saya menggunakan echo laravel dengan React Native pada opsi server soket perubahan android pingTimeout menjadi 30000. Berhasil

@sospedra got . Saya harus melakukan beberapa pengujian untuk memastikan itu tidak terlalu buruk!

Apakah ada alasan untuk tidak selalu menggunakan Handler.postDelayed?

ada perbaikan cepat untuk masalah ini? Saya baru saja mulai menggunakan RN dengan Firebase.

Saya telah mencoba beberapa solusi pengatur waktu yang berbeda, tetapi belum beruntung membuatnya bekerja di latar belakang (secara konsisten).

Saya menggunakan setInterval untuk melakukan ping ke server saya setiap 10 menit - Saya baru saja melihat pesan kesalahan ini karena saya melakukan setInterval(myFunction, 60000) . Apakah ini sesuatu yang perlu saya khawatirkan?

Perilaku yang saya harapkan adalah bahwa saat aplikasi terbuka, ia dapat mengirimkan permintaan, tetapi setelah aplikasi ditangguhkan (tekan tombol beranda tunggal) permintaan akan berhenti diaktifkan. Apakah ini perilaku yang dapat saya harapkan, dan apakah masa pakai baterai akan terpengaruh saat aplikasi ditangguhkan?

Tidak ada yang perlu dikhawatirkan di sini, dan peringatannya salah dan harus dihapus. Tidak ada "Timing Module" untuk tetap aktif, hanya ada callback Koreografer yang memeriksa pengatur waktu setiap frame (yang juga membuat perincian minimum untuk pengatur waktu menjadi ~ 16 md).

Ada masalah kebenaran dalam arti bahwa pengatur waktu tidak akan menyala di latar belakang baik di iOS atau Android. Peringatan ini tampaknya khusus tentang Android dan tampaknya tidak akurat. Semua pengatur waktu pada akhirnya akan diaktifkan saat aplikasi kembali ke latar depan.

Adakah rencana agar hal ini segera ditangani? Log mengganggu setiap kali kami menguji di ponsel Android.

Masalahku…

Saya mendapatkan kesalahan ini karena waktu tunggu saya hingga ~ 59 menit. Kode untuk memanggil metode di atas jam dan memiliki setTimeout untuk membuat setInterval di jam sibuk berikutnya.

Solusi Saya…

  1. perbarui setTimeout untuk memulai setInterval di bagian atas menit.
  2. perbarui fungsi yang dipanggil oleh setInterval untuk hanya menjalankan fungsi jika menit saat ini adalah 0 .

Fungsi ini sekarang berjalan setiap menit, bukan setiap jam… tetapi karena tidak melakukan apa pun 59 kali dari 60, tampaknya tidak berbahaya.

hai @beausmith , apakah ini benar-benar solusi untuk hanya mengatur 60 timer? Untuk pemahaman saya, itu masih membuat timerModule aktif untuk jam yang sama, tetapi tidak menampilkan peringatan :)

@newah - ya, ini sedikit hacky… dapatkah Anda menyarankan solusi yang lebih baik?

@beausmith , saya mencoba menggunakan https://github.com/ocetnik/react-native-background-timer yang menggunakan timer asli yang terdengar seperti solusi - Saya baru saja menimpa setTimout dan setInterval dengan implementasi lib ini.

Mendukung pengatur waktu di latar belakang mungkin plus atau minus tergantung pada kebutuhan Anda :))

Tampaknya berfungsi dengan baik, tetapi tidak menyelesaikan masalah saya :)

Saya memiliki peringatan yang sama jika saya menggunakan react-intl FormattedRelative. Karena di dalam komponen FormattedRelative digunakan timer:

scheduleNextUpdate(props, state) {
    // Cancel and pending update because we're scheduling a new update.
    clearTimeout(this._timer);

    const {value, units, updateInterval} = props;
    const time = new Date(value).getTime();

    // If the `updateInterval` is falsy, including `0` or we don't have a
    // valid date, then auto updates have been turned off, so we bail and
    // skip scheduling an update.
    if (!updateInterval || !isFinite(time)) {
      return;
    }

    const delta = time - state.now;
    const unitDelay = getUnitDelay(units || selectUnits(delta));
    const unitRemainder = Math.abs(delta % unitDelay);

    // We want the largest possible timer delay which will still display
    // accurate information while reducing unnecessary re-renders. The delay
    // should be until the next "interesting" moment, like a tick from
    // "1 minute ago" to "2 minutes ago" when the delta is 120,000ms.
    const delay =
      delta < 0
        ? Math.max(updateInterval, unitDelay - unitRemainder)
        : Math.max(updateInterval, unitRemainder);

    this._timer = setTimeout(() => {
      this.setState({now: this.context.intl.now()});
    }, delay);
  }

Berikut adalah contoh penggunaan dalam kode saya:

<FormattedRelative value={date}>
    {(message: string) => <Text>{message}</Text>}
</FormattedRelative>

Ada yang tahu cara memperbaiki peringatan ini?

Ini masih menjadi masalah. Ini sangat mengganggu saat menggunakan layanan firebase di android. Tolong perbaiki.

Ini adalah bug yang sangat buruk untuk layanan firebase dan ketika Anda bergantung pada aplikasi pihak ketiga. Karena firebase tidak berfungsi jika Anda beralih antar aplikasi untuk memverifikasi sesuatu untuk melanjutkan proses.

Contohnya adalah kita menggunakan sistem login pihak ketiga / faktor, dan menggunakan firebase untuk memindahkan token. Tapi karena kita membersihkan tokennya hilang sebelum orang itu kembali ke aplikasi kita. Jadi saya bisa mengganti mekanisme pembersihan, atau kalian bisa memperbaiki bug ini.

@vongohren bukan berarti saya memahami kasus penggunaan Anda sepenuhnya, tetapi satu strategi solusinya mungkin menyimpan tanggal latar belakang dalam aplikasi Anda saat masuk ke latar belakang, lalu saat kembali ke latar depan, bandingkan tanggal saat ini dengan tanggal latar belakang yang disimpan dan lakukan pembersihan jika jangka waktu tertentu telah berlalu ...

Untuk menguraikan kasus penggunaan saya. Katakanlah Anda bergantung pada mengatakan ya di aplikasi lain untuk menerima login. Feks beralih ke aplikasi facebook untuk mengatakan ya untuk permintaan masuk di pihak ketiga. Contoh konkret yang saya kerjakan adalah uPort, https://www.uport.me/. Kemudian ketika kita mengandalkan cara untuk mengirim pesan ke aplikasi kita, sekarang di latar belakang untuk mengatakan bahwa semuanya baik-baik saja, ini tidak akan berfungsi dengan firebase kecuali kita mengambil pendekatan Anda untuk membersihkannya nanti.

Saya kira saya hanya terjebak pada bahwa pembersihan bisa terjadi tepat setelah informasi dikeluarkan, karena informasi itu sudah keluar, dan kami tidak membutuhkannya. Tetapi mengapa pendekatan firebase tidak berfungsi di react native? Itu menghentikan pekerja latar belakangnya.

Saya perlu waktu tunggu 30 menit di aplikasi saya. Setiap kali pengguna berinteraksi dengan layar, itu akan mengatur ulang (buang waktu tunggu lama, buat yang baru).

Adakah alternatif tentang bagaimana melakukan ini dengan cara yang benar? Apakah lebih baik menangani ini dengan kode asli dan meneruskan sesuatu ke React setelah selesai?

wow, jadi ini masih jadi masalah

@nbennink periksa jawabannya di sini . Saat ini tidak ada jaminan cara untuk menjalankan tugas di latar belakang karena ada beberapa faktor yang sedang dimainkan (penghemat baterai, interaksi pengguna, dll.).

Saya juga mendapatkan peringatan yang sama setelah menggunakan socket.io.
Peringatan ada di bawah:

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info.
(Saw setTimeout with duration 85000ms)

Detail paket saya ada di bawah:

  • "react": "^ 16.3.0-alpha.1",
  • "react-native": "0.54.4",
  • "socket.io": "^ 2.1.1",
  • "socket.io-client": "^ 2.1.1",

Cari tahu solusi permanen apa?

Saya juga mendapatkan peringatan yang sama setelah menggunakan socket.io.
Peringatan ada di bawah:

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info.
(Saw setTimeout with duration 85000ms)

Detail paket saya ada di bawah:

"react": "^ 16.3.0-alpha.1",
"react-native": "0.54.4",
"socket.io": "^ 2.1.1",
"socket.io-client": "^ 2.1.1",

Cari tahu solusi permanen apa?

Ditto, tidak ada cara untuk mengatasi ini?

Masih mendapatkan peringatan ini di react-native 0.57, apakah masalah ini seharusnya terbuka?

Hampir satu tahun dan React Native masih memiliki masalah yang sama !!!

Menghadapi masalah yang sama, peringatan yang sama muncul 3-4 kali. Sangat menyebalkan.

Apakah ada solusi untuk mengatasi masalah ini?

Singkirkan pesan peringatan dengan solusi ini https://stackoverflow.com/a/48778011/7427111

Ini pada dasarnya hanya menyembunyikan pesan yang tidak memperbaiki masalah, saya kira.

@dhavaljardosh Ya, tebakan Anda benar.

Saya membuat pengatur waktu asli dengan Java dan Objective C. Ini berfungsi untuk saya dan menyembunyikan pesan. Saya tidak yakin apakah itu benar-benar meningkatkan kinerja. Seperti yang disebutkan di atas: Masih buruk untuk baterai dll karena ada pengatur waktu yang lama di latar belakang.

Satu pertanyaan untuk ditanyakan adalah apakah Anda benar-benar membutuhkan fungsi polling. Saya pikir saya melakukannya, tetapi kemudian karena masalah ini, saya menyadari bahwa saya hanya perlu mengeksekusi pada periode waktu semi-sering _some_. Jadi sekarang saya menjalankannya di latar belakang aplikasi dan benar-benar menghindari masalah ini. YMMV.

masalah yang sama saat menggunakan Pusher ...

Saya akan menguji aplikasi saya untuk melihat apa dampak kinerja saat menyetel pengatur waktu setiap 60 detik.
Saya berasumsi, bagaimanapun, bahwa beberapa dari Anda memiliki pengalaman dengan itu. Bisakah Anda berbagi pengalaman ini? Apakah dampaknya signifikan?

masalah masih sama dengan versi terbaru.
ada solusi?

Saya menghadapi masalah itu juga.
Aplikasi berfungsi dengan baik, hanya ketika saya mulai menggunakan firebase, peringatan itu datang.
Ada solusi?

Saya ingin memahami arti di balik pesan ini karena kami mulai menerimanya setelah fitur terbaru yang kami tambahkan ke produk kami. Apakah masalahnya _hanya_ dengan fakta bahwa pengatur waktu terus berjalan saat aplikasi di latar belakang? Apakah akan menjadi solusi yang tepat untuk berlangganan acara status aplikasi dan menghentikan pengatur waktu jika aplikasi di latar belakang? Atau apakah pengatur waktu yang berjalan lama dengan aplikasi di _foreground_ juga bermasalah?

Saya ingin memahami arti di balik pesan ini karena kami mulai menerimanya setelah fitur terbaru yang kami tambahkan ke produk kami. Apakah masalahnya _hanya_ dengan fakta bahwa pengatur waktu terus berjalan saat aplikasi di latar belakang? Apakah akan menjadi solusi yang tepat untuk berlangganan acara status aplikasi dan menghentikan pengatur waktu jika aplikasi di latar belakang? Atau apakah pengatur waktu yang berjalan lama dengan aplikasi di _foreground_ juga bermasalah?

Ingin tahu ini juga.

Selanjutnya, apa yang terjadi dengan setInterval? Saya tidak mendapatkan peringatan dari yang satu ini, tetapi apakah ada masalah yang sama?

Saya ingin memahami arti di balik pesan ini karena kami mulai menerimanya setelah fitur terbaru yang kami tambahkan ke produk kami. Apakah masalahnya _hanya_ dengan fakta bahwa pengatur waktu terus berjalan saat aplikasi di latar belakang? Apakah akan menjadi solusi yang tepat untuk berlangganan acara status aplikasi dan menghentikan pengatur waktu jika aplikasi di latar belakang? Atau apakah pengatur waktu yang berjalan lama dengan aplikasi di _foreground_ juga bermasalah?

Pesan Kuning mengatakan "... dan pengatur waktu hanya dapat dipanggil saat aplikasi berada di latar depan."
Modul pengatur waktu tetap aktif tetapi pengatur waktu tidak dapat beroperasi saat aplikasi berada di latar belakang? Jadi masalahnya adalah menjaga modul pengatur waktu tetap aktif saat aplikasi di latar belakang? Seberapa besar kinerja / efek baterai yang akan membuat saya bertanya-tanya ...

@BerndWessels https://www.npmjs.com/package/react-native-firebase Pernahkah Anda melihat ini? Mengatakan itu memungkinkan firebase untuk berjalan di thread asli. Tidak yakin seberapa benar itu, tetapi mungkin menarik untuk dilihat. Anda bahkan mungkin menggunakan itu, saya tidak yakin.

Apakah menurut Anda jika saya beralih ke perpustakaan ini, saya harus mengubah kode yang sudah ada? Maksudku, itu tidak akan menyenangkan ...

masalah yang sama dengan Pusher di RN0.59 terbaru, dan UI mungkin macet beberapa detik ...

Sepertinya saya hanya mengalami masalah ini saat melakukan panggilan ke database realtime firebase.

await firebase.database().ref('users/' + id).set(data);

RN 0.57.1

Saya belum mengkonfirmasi dengan 0,59.

@swushi Saya mendapatkan masalah yang sama dengan RN 0.59

Saya mendapatkan peringatan berikut saat menggunakan pustaka firebase

Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info. (Saw setTimeout with duration 111862ms)

Bagaimana cara menghilangkan peringatan ini ...

Adakah yang tahu bagaimana cara menghilangkan peringatan ini tanpa menyembunyikannya ??
Saya menggunakan pustaka firebase bukan react-native-firebase, tetapi tampaknya memiliki masalah yang sama dan saya tidak tahu bagaimana pengaruhnya terhadap saya ketika masuk ke produksi.

Saya sangat khawatir jadi jika seseorang bisa membantu tolong ...

Saya menggunakan kode berikut untuk mengatasi masalah ini (saat ini):

lihat https://github.com/firebase/firebase-js-sdk/issues/97#issuecomment -427512040

fixtimerbug.js

/////////////////////////////////////////////////////////////////////////////
////// temporary fix to bug about 'Setting a timer' /////////////////////////
////// See: https://github.com/pusher/pusher-js/issues/248 //////////////////
////// See: https://github.com/facebook/react-native/issues/12981 ///////////
////// See: https://github.com/firebase/firebase-js-sdk/issues/97 ///////////
/////////////////////////////////////////////////////////////////////////////
import { Platform, InteractionManager } from 'react-native';
const _setTimeout = global.setTimeout;
const _clearTimeout = global.clearTimeout;
const MAX_TIMER_DURATION_MS = 60 * 1000;
if (Platform.OS === 'android') {
  const timerFix = {};
  const runTask = (id, fn, ttl, args) => {
    const waitingTime = ttl - Date.now();
    if (waitingTime <= 1) {
      InteractionManager.runAfterInteractions(() => {
        if (!timerFix[id]) {
          return;
        }
        delete timerFix[id];
        fn(...args);
      });
      return;
    }
    const afterTime = Math.min(waitingTime, MAX_TIMER_DURATION_MS);
    timerFix[id] = _setTimeout(() => runTask(id, fn, ttl, args), afterTime);
  };
  global.setTimeout = (fn, time, ...args) => {
    if (MAX_TIMER_DURATION_MS < time) {
      const ttl = Date.now() + time;
      const id = '_lt_' + Object.keys(timerFix).length;
      runTask(id, fn, ttl, args);
      return id;
    }
    return _setTimeout(fn, time, ...args);
  };
  global.clearTimeout = id => {
    if (typeof id === 'string' && id.startsWith('_lt_')) {
      _clearTimeout(timerFix[id]);
      delete timerFix[id];
      return;
    }
    _clearTimeout(id);
  };
}
/////////////////////////////////////////////////////////////////////////////

@pmech
Anda menerapkannya dalam file .js independen, atau Anda melakukannya di dalam skrip yang membuat pengecualian timer

Hai, ya, kode di atas masuk ke dalam file bernama 'fixtimerbug.js'. Kemudian, saya memuatnya di App.js saya seperti ini:

import './src/fixtimerbug'; // <<<<<<<<<<<<<<<<<<

import React from 'react';
import { Platform, View, StatusBar } from 'react-native';
import AppNavigator from './src/navigation/AppNavigator';
import Store from './src/model/Store';

const store = new Store();

const App = () => (
  <View style={{ flex: 1, backgroundColor: '#fff' }}>
    {Platform.OS === 'ios' && <StatusBar barStyle="default" />}
    <AppNavigator screenProps={{ store }} />
  </View>
);

export default App;

Tampaknya ini berfungsi dengan baik, apa fungsinya dengan tepat?

Terima kasih banyak @cpmech

Hai, kode (dari sini: https://github.com/firebase/firebase-js-sdk/issues/97#issuecomment-427512040) cukup membungkus fungsi setTimeout (global) untuk mencegahnya digunakan dengan jangka waktu lama.

Dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih besar dari ambang batas MAX_TIMER_DURATION_MS , kami menyimpan id di peta lokal ( timerFix ) dan kemudian panggil runTask yang membagi waktu durasi menjadi nilai yang lebih kecil. runTask menetapkan batas waktu (menggunakan aslinya _setTimeout ) dengan potongan yang lebih kecil yang akan terus dijalankan sampai waitingTime terlalu kecil. Ketika waitingTime cukup kecil, kami memanggil React Native's runAfterInteractions untuk kelancaran eksekusi, dan, pada saat yang sama, kami menghapus entri id dari peta lokal kami karena kami menang tidak akan menelepon _setTimeout lagi dalam kasus ini. Perhatikan bahwa afterTime dimasukkan ke dalam _setTimeout untuk mencegahnya dipanggil dengan periode yang lama.

Sebaliknya, dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih kecil dari ambang batas MAX_TIMER_DURATION_MS , kami langsung memanggil setTimeout global (disimpan dalam _setTimeout ).

clearTimeout global juga dibungkus untuk melakukan proses pembersihan dengan menghapus id dari peta lokal.

Semoga membantu!

Menghadapi masalah yang sama .. Sepertinya, kita harus menyembunyikan peringatan untuk saat ini. Inilah cara terpendek untuk melakukannya:
componentDidMount() { console.disableYellowBox = true; ... }

Hai, kode (dari sini: firebase / firebase-js-sdk # 97 (comment) ) cukup membungkus fungsi setTimeout (global) untuk mencegahnya digunakan dalam waktu lama.

Dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih besar dari ambang batas MAX_TIMER_DURATION_MS , kami menyimpan id di peta lokal ( timerFix ) dan kemudian panggil runTask yang membagi waktu durasi menjadi nilai yang lebih kecil. runTask menetapkan batas waktu (menggunakan aslinya _setTimeout ) dengan potongan yang lebih kecil yang akan terus dijalankan sampai waitingTime terlalu kecil. Ketika waitingTime cukup kecil, kami memanggil React Native's runAfterInteractions untuk kelancaran eksekusi, dan, pada saat yang sama, kami menghapus entri id dari peta lokal kami karena kami menang tidak akan menelepon _setTimeout lagi dalam kasus ini. Perhatikan bahwa afterTime dimasukkan ke dalam _setTimeout untuk mencegahnya dipanggil dengan periode yang lama.

Sebaliknya, dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih kecil dari ambang batas MAX_TIMER_DURATION_MS , kami langsung memanggil setTimeout global (disimpan dalam _setTimeout ).

clearTimeout global juga dibungkus untuk melakukan proses pembersihan dengan menghapus id dari peta lokal.

Semoga membantu!

Terima kasih banyak! Bekerja seperti pesona.

Hai, kode (dari sini: firebase / firebase-js-sdk # 97 (comment) ) cukup membungkus fungsi setTimeout (global) untuk mencegahnya digunakan dalam waktu lama.

Dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih besar dari ambang batas MAX_TIMER_DURATION_MS , kami menyimpan id di peta lokal ( timerFix ) dan kemudian panggil runTask yang membagi waktu durasi menjadi nilai yang lebih kecil. runTask menetapkan batas waktu (menggunakan aslinya _setTimeout ) dengan potongan yang lebih kecil yang akan terus dijalankan sampai waitingTime terlalu kecil. Ketika waitingTime cukup kecil, kami memanggil React Native's runAfterInteractions untuk kelancaran eksekusi, dan, pada saat yang sama, kami menghapus entri id dari peta lokal kami karena kami menang tidak akan menelepon _setTimeout lagi dalam kasus ini. Perhatikan bahwa afterTime dimasukkan ke dalam _setTimeout untuk mencegahnya dipanggil dengan periode yang lama.

Sebaliknya, dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih kecil dari ambang batas MAX_TIMER_DURATION_MS , kami langsung memanggil setTimeout global (disimpan dalam _setTimeout ).

clearTimeout global juga dibungkus untuk melakukan proses pembersihan dengan menghapus id dari peta lokal.

Semoga membantu!

Apakah ini benar-benar mengatasi masalah atau hanya menghapus peringatan?

Hai, kode (dari sini: firebase / firebase-js-sdk # 97 (comment) ) cukup membungkus fungsi setTimeout (global) untuk mencegahnya digunakan dalam waktu lama.

Dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih besar dari ambang batas MAX_TIMER_DURATION_MS , kami menyimpan id di peta lokal ( timerFix ) dan kemudian panggil runTask yang membagi waktu durasi menjadi nilai yang lebih kecil. runTask menetapkan batas waktu (menggunakan aslinya _setTimeout ) dengan potongan yang lebih kecil yang akan terus dijalankan sampai waitingTime terlalu kecil. Ketika waitingTime cukup kecil, kami memanggil React Native's runAfterInteractions untuk kelancaran eksekusi, dan, pada saat yang sama, kami menghapus entri id dari peta lokal kami karena kami menang tidak akan menelepon _setTimeout lagi dalam kasus ini. Perhatikan bahwa afterTime dimasukkan ke dalam _setTimeout untuk mencegahnya dipanggil dengan periode yang lama.

Sebaliknya, dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih kecil dari ambang batas MAX_TIMER_DURATION_MS , kami langsung memanggil setTimeout global (disimpan dalam _setTimeout ).

clearTimeout global juga dibungkus untuk melakukan proses pembersihan dengan menghapus id dari peta lokal.

Semoga membantu!

Terima kasih banyak! Itu tidak akan mempengaruhi kinerja aplikasi secara keseluruhan, kan?

Hai, kode (dari sini: firebase / firebase-js-sdk # 97 (comment) ) cukup membungkus fungsi setTimeout (global) untuk mencegahnya digunakan dalam waktu lama.
Dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih besar dari ambang batas MAX_TIMER_DURATION_MS , kami menyimpan id di peta lokal ( timerFix ) dan kemudian panggil runTask yang membagi waktu durasi menjadi nilai yang lebih kecil. runTask menetapkan batas waktu (menggunakan aslinya _setTimeout ) dengan potongan yang lebih kecil yang akan terus dijalankan sampai waitingTime terlalu kecil. Ketika waitingTime cukup kecil, kami memanggil React Native's runAfterInteractions untuk kelancaran eksekusi, dan, pada saat yang sama, kami menghapus entri id dari peta lokal kami karena kami menang tidak akan menelepon _setTimeout lagi dalam kasus ini. Perhatikan bahwa afterTime dimasukkan ke dalam _setTimeout untuk mencegahnya dipanggil dengan periode yang lama.
Sebaliknya, dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih kecil dari ambang batas MAX_TIMER_DURATION_MS , kami langsung memanggil setTimeout global (disimpan dalam _setTimeout ).
clearTimeout global juga dibungkus untuk melakukan proses pembersihan dengan menghapus id dari peta lokal.
Semoga membantu!

Apakah ini benar-benar mengatasi masalah atau hanya menghapus peringatan?

Tidak, itu tidak mengatasi masalah tersebut. Ini hanya pekerjaan yang bagus.

Hai, kode (dari sini: firebase / firebase-js-sdk # 97 (comment) ) cukup membungkus fungsi setTimeout (global) untuk mencegahnya digunakan dalam waktu lama.
Dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih besar dari ambang batas MAX_TIMER_DURATION_MS , kami menyimpan id di peta lokal ( timerFix ) dan kemudian panggil runTask yang membagi waktu durasi menjadi nilai yang lebih kecil. runTask menetapkan batas waktu (menggunakan aslinya _setTimeout ) dengan potongan yang lebih kecil yang akan terus dijalankan sampai waitingTime terlalu kecil. Ketika waitingTime cukup kecil, kami memanggil React Native's runAfterInteractions untuk kelancaran eksekusi, dan, pada saat yang sama, kami menghapus entri id dari peta lokal kami karena kami menang tidak akan menelepon _setTimeout lagi dalam kasus ini. Perhatikan bahwa afterTime dimasukkan ke dalam _setTimeout untuk mencegahnya dipanggil dengan periode yang lama.
Sebaliknya, dalam fungsi global.setTimeout kami yang telah dimodifikasi, jika durasi waktu lebih kecil dari ambang batas MAX_TIMER_DURATION_MS , kami langsung memanggil setTimeout global (disimpan dalam _setTimeout ).
clearTimeout global juga dibungkus untuk melakukan proses pembersihan dengan menghapus id dari peta lokal.
Semoga membantu!

Terima kasih banyak! Itu tidak akan mempengaruhi kinerja aplikasi secara keseluruhan, kan?

Tidak, itu tidak memengaruhi kinerja sama sekali.

Catatan singkat tentang

Jika mengganggu Anda cukup menambahkan console.ignoredYellowBox = ['Setting a timer'];

dan

Menghadapi masalah yang sama .. Sepertinya, kita harus menyembunyikan peringatan untuk saat ini. Inilah cara terpendek untuk melakukannya:
componentDidMount () {console.disableYellowBox = true; ...}

Ini bukanlah solusi yang bisa diterapkan. Kesalahan masih terjadi, Anda hanya tidak mendapatkan pemberitahuan.

Hasil? Penguraian kesalahan masih perlu terjadi.

Dalam kasus menggunakan pendengar Firebase, misalnya, Anda akan menyembunyikan banyak kesalahan, tetapi lingkungan pengembangan Anda akan tetap menanganinya.

Contoh kasus: proyek berbasis expo saya terus mogok karena mencoba memetakan setiap kesalahan pengatur waktu.

Saya menutup ini karena menurut saya React Native tidak akan menambahkan dukungan untuk AlarmManager di intinya. Ini dapat dilakukan dengan modul pihak ketiga atau kode asli khusus.

Solusi @cpmech bekerja? Saya mencobanya di RN60.4, tetapi mendapatkan peringatan timer yang lama.

Hai, saya rasa saya menemukan solusinya:
Pertama, Anda harus menemukan file berikut dalam proyek Anda: libraries / Core / Timers / JSTimer; js
Buka dan Anda hanya perlu mengubah konstanta ini MAX_TIMER_DURATION_MS, untuk menambah durasi Anda, tulis di akhir peringatan!

tambah pengatur waktunya, tapi seberapa banyak?

@dulmandakh adakah proyek sumber terbuka yang menyelesaikan masalah ini yang Anda ketahui?

@dulmandakh adakah proyek sumber terbuka yang menyelesaikan masalah ini yang Anda ketahui?

RNFirebase mungkin? @tokopedia

Anda dapat menjadwal ulang pengatur waktu dengan waktu tetap hingga berakhir:


const setLogoutTimer = expirationTime => {

  return dispatch => {
    timer = setTimeout(() => {
        if (expirationTime>60000)
        {
            console.log(`set new exp:${expirationTime-60000}`);
            dispatch(setLogoutTimer(expirationTime-60000));
        }
        else
        {
            console.log('logout');
            dispatch(logout());
        }
    }, 60000); 
  };
};

Sudah 2 tahun akan react-native atau firebase memperbaiki masalah ini dengan benar. :(

ok setelah beberapa jam penyelidikan panjang, yang ingin saya ketahui adalah apakah saya menyebabkan masalah tersebut.
Saya tidak yakin kapan itu muncul.
apakah itu muncul segera setelah saya menelepon firestore?
Saya tidak menggunakan timer apa pun di aplikasi saya

@luismasg Saya tidak menggunakan setTimeout dalam kode saya karena ini adalah praktik yang buruk tetapi saya tahu sumber kesalahan dan saya tidak dapat menghentikannya dan tampaknya itu berasal dari membuat koneksi jarak jauh dengan database saya ternyata perpustakaan yang saya gunakan set Time out untuk menjaga TTL tetap hidup, periksa pustaka dependensi Anda dan lihat apakah Anda dapat mengidentifikasi penyebab masalah

Sejujurnya, saya tidak berpikir menggunakan pengatur waktu / interval JS adalah ide yang baik untuk pengatur waktu yang lama, peringatannya ada karena suatu alasan.

Gunakan peristiwa siklus hidup untuk menambah / menghapus timer pendek. Jika Anda membutuhkan eksekusi latar belakang sebenarnya, gunakan kode asli dengan layanan latar depan (Android) dan tugas latar belakang (iOS).

Sejujurnya, saya tidak berpikir menggunakan pengatur waktu / interval JS adalah ide yang baik untuk pengatur waktu yang lama, peringatannya ada karena suatu alasan.

Seperti disebutkan secara luas di atas, banyak orang kesulitan dengan perpustakaan yang menggunakan pengatur waktu yang lebih lama. "Hanya saja, jangan gunakan firebase" bukanlah solusi.

Jelas ini adalah masalah yang sering ditemui, menanganinya akan meningkatkan pengalaman pengembang react-native yang kedengarannya seperti itu tujuan akhir ...

Saya tidak akan mengatakan "jangan gunakan firebase" adalah jawabannya, lebih seperti, "perbaiki firebase agar tidak menggunakan timer lama dan gunakan blok penyusun asli yang sesuai untuk tugas yang mereka gunakan dengan timer lama".

Tetapi Anda benar, akan ideal jika RN mendukung pengatur waktu yang lama, tetapi mengingat semua peringatan yang ada (seperti konsumsi baterai yang lebih tinggi, waktu eksekusi latar belakang yang tidak perlu, dll.), Itu hanya akan membuat pengembang menembak diri sendiri. Jika ada, itu harus menjadi timer / interval primitif terpisah.

Jika ada, itu harus menjadi timer / interval primitif terpisah.

Pemahaman saya tentang apa masalah ini adalah kurangnya 😄 primitif seperti itu

gunakan pengatur waktu di dalam pengatur waktu, itu saja!

@dulmandakh mengapa masalah ini ditutup? Masalahnya tetap ada dan diskusi sedang berlangsung?

Saya menambahkan ini ke App.js, dan ini memperbaikinya (sementara sampai ada perbaikan resmi)

const _setTimeout = global.setTimeout;
const _clearTimeout = global.clearTimeout;
const MAX_TIMER_DURATION_MS = 60 * 1000;
if (Platform.OS === "android") {
  // Work around issue `Setting a timer for long time`
  // see: https://github.com/firebase/firebase-js-sdk/issues/97
  const timerFix = {};
  const runTask = (id, fn, ttl, args) => {
    const waitingTime = ttl - Date.now();
    if (waitingTime <= 1) {
      InteractionManager.runAfterInteractions(() => {
        if (!timerFix[id]) {
          return;
        }
        delete timerFix[id];
        fn(...args);
      });
      return;
    }

    const afterTime = Math.min(waitingTime, MAX_TIMER_DURATION_MS);
    timerFix[id] = _setTimeout(() => runTask(id, fn, ttl, args), afterTime);
  };

  global.setTimeout = (fn, time, ...args) => {
    if (MAX_TIMER_DURATION_MS < time) {
      const ttl = Date.now() + time;
      const id = "_lt_" + Object.keys(timerFix).length;
      runTask(id, fn, ttl, args);
      return id;
    }
    return _setTimeout(fn, time, ...args);
  };

  global.clearTimeout = id => {
    if (typeof id === "string" && id.startWith("_lt_")) {
      _clearTimeout(timerFix[id]);
      delete timerFix[id];
      return;
    }
    _clearTimeout(id);
  };
}

Ini adalah solusi, bukan perbaikan.

Saya menambahkan ini ke App.js, dan ini memperbaikinya (sementara sampai ada perbaikan resmi)

...
    if (typeof id === "string" && id.startWith("_lt_")) {
...

'startWith' harus menjadi 'beginWith' jika Anda akan menggunakan kode itu.

Saya mengalami ini dengan AWS Amplify Datastore. Sebagai pengganti perbaikan yang tepat, saya menonaktifkan peringatan dengan

import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings(['Setting a timer']);

Tidak jelas bagi saya apakah masalah yang mendasarinya adalah sesuatu yang perlu diperbaiki RN, Amplify perlu diperbaiki, atau sesuatu yang perlu saya tambal. Jelas saya tidak ingin masalah kinerja.

Jika itu mengganggu Anda cukup menambahkan console.ignoredYellowBox = ['Setting a timer'];

Di mana saya harus menambahkan ini, saya mencoba di File layar dan file tindakan, masih tidak berfungsi

Letakkan saja di suatu tempat di file App.js Anda. Saya memasukkannya ke dalam konstruktor saya misalnya.
Tidak tahu apakah itu tempat terbaik, jadi jika ada yang tahu sesuatu yang lebih baik, saya ingin mendengarnya!

Saya rasa siapa pun yang menggunakan Firebase dapat menyelesaikan masalah ini dengan mengonfigurasi persistensi aplikasi setelahnya (signIn / signUp)

* setelah membuat pengguna baru, dia akan masuk secara otomatis

https://firebase.google.com/docs/auth/web/auth-state-persistence

jadi ... setelah pengguna auth, variabel waktu dibuat.

default untuk firebase adalah local . "firebase.auth.Auth.Persistence.LOCAL"

Anda dapat mengubah menggunakan:
firebase.auth.Auth.Persistence.SESSION
firebase.auth.Auth.Persistence.NONE

atau menggunakan localStorage ...

Sampai mereka menyelesaikannya dengan cara yang pasti ...

impor {YellowBox} dari "react-native";
impor _ dari "lodash";
YellowBox.ignoreWarnings (["Menyetel pengatur waktu"]);
const _console = _.clone (konsol);
console.warn = (pesan) => {
if (message.indexOf ("Menyetel pengatur waktu") <= -1) {
_console.warn (pesan);
}
};

Setelah dipecahkan, kode sampah dihapus dan voila!

Ini bisa diatasi dengan RxJS.

Pada dasarnya membagi timer 5200 menjadi 5 * 1000 + 200 timer.

import { of, range } from 'rxjs';
import {
  concatMap,
  delay,
  filter,
  mapTo,
  switchMap,
  tap,
} from 'rxjs/operators';

// ~ setTimeout(..., 5200);

const source = of(5200).pipe(
  switchMap(duration => {
    const times = Math.floor(duration / 1000); // = 5
    const remainder = duration % 1000; // = 200

    return range(1, times).pipe(
      concatMap(i => of(i).pipe(delay(1000))),
      tap(console.log),
      filter(i => i === times),
      delay(remainder),
      tap(console.log),
      mapTo('Done !'),
    );
  }),
);

source.subscribe(console.log);

1 // After 1s
2 // After 2s
3 // After 3s
4 // After 4s
5 // After 5s
5 // After 5s + 200 ms
'Done !'

Saya rasa siapa pun yang menggunakan Firebase dapat menyelesaikan masalah ini dengan mengonfigurasi persistensi aplikasi setelahnya (signIn / signUp)

* setelah membuat pengguna baru, dia akan masuk secara otomatis

https://firebase.google.com/docs/auth/web/auth-state-persistence

jadi ... setelah pengguna auth, variabel waktu dibuat.

default untuk firebase adalah local . "firebase.auth.Auth.Persistence.LOCAL"

Anda dapat mengubah menggunakan:
firebase.auth.Auth.Persistence.SESSION
firebase.auth.Auth.Persistence.NONE

atau menggunakan localStorage ...

Bagus! Bagaimana dengan Firestore?

Saya rasa siapa pun yang menggunakan Firebase dapat menyelesaikan masalah ini dengan mengonfigurasi persistensi aplikasi setelahnya (signIn / signUp)
* setelah membuat pengguna baru, dia akan masuk secara otomatis
https://firebase.google.com/docs/auth/web/auth-state-persistence
jadi ... setelah pengguna auth, variabel waktu dibuat.
default untuk firebase adalah local . "firebase.auth.Auth.Persistence.LOCAL"
Anda dapat mengubah menggunakan:
firebase.auth.Auth.Persistence.SESSION
firebase.auth.Auth.Persistence.NONE
atau menggunakan localStorage ...

Bagus! Bagaimana dengan Firestore?

jika Anda menggunakan SDK firebase lama, migrasikan ke SDK admin firestore.

sebagian besar masalah akan terpecahkan

https://firebase.google.com/docs/reference/admin

Tetap tidak ada yang bisa menyelesaikan masalah ini. #malu pada Anda pengembang; hal

Tetap tidak ada yang bisa menyelesaikan masalah ini. #malu pada Anda pengembang; hal

Jangan pernah mempermalukan kontributor open source. Sayangnya ini belum diperbaiki tetapi sumbernya terbuka, jika Anda tahu cara menyelesaikannya, saya yakin mereka akan menghargai permintaan tarik.

Itulah mengapa masalah ini ditutup .

Karena itu harus diperbaiki di perpustakaan yang menyinggung. Dan perpustakaan yang melanggar tidak melihat masalah dengan cara penerapannya.

Jadi tidak ada yang akan memperbaikinya karena kedua sisi tidak menganggapnya rusak.

Mereka bisa merasa malu sedikit_ untuk ini 😄

Teman-teman, saya pikir ini belum "diselesaikan" karena alasan sederhana bahwa menggunakan timer lama adalah ide yang sangat buruk.

Jika Anda ingin menjalankan pengatur waktu di latar belakang / acara di masa mendatang, Anda memerlukan perpustakaan asli untuk melakukannya. Ini juga sulit dilakukan pada kedua platform karena kendala eksekusi latar belakang.

Berdasarkan komentar @eightyfive , kami membuat penurunan untuk fungsi rxjs6 delay , timeout & interval .

Masih ada pertanyaan, dapatkah seseorang menjelaskan jika "modul Timer" tetap terkunci saat menggunakan interval yang lebih kecil? Pada dasarnya hanya menyebabkan pengatur waktu berhenti saat aplikasi tidak berada di latar depan. Atau apakah ini hanya menyembunyikan masalah?

import { switchMap, concatMap, delay as nativeDelay, mapTo, filter, switchMapTo, repeat } from 'rxjs/operators'
import { range, of, race, throwError, TimeoutError } from 'rxjs'

const TIMER_INTERVAL = 1000
const reactNativeTimer = (duration) => {
  const times = Math.floor(duration / TIMER_INTERVAL)
  const remainder = duration % TIMER_INTERVAL
  if (times < 1) {
    return of(true).pipe(nativeDelay(remainder))
  }
  return range(1, times).pipe(
    concatMap(i => of(i).pipe(nativeDelay(TIMER_INTERVAL))),
    filter(i => i === times),
    nativeDelay(remainder)
  )
}

/**
 * React Native compatible version of delay pipe
 * <strong i="11">@param</strong> {number} duration in ms
 */
export const delay = (duration) => {
  return (source) => {
    return source.pipe(
      switchMap(next =>
        reactNativeTimer(duration).pipe(mapTo(next))
      )
    )
  }
}

/**
 * React Native compatible version of timeout pipe
 * <strong i="12">@param</strong> {number} duration in ms
 */
export const timeout = (duration) => {
  return (source) => {
    const timeoutTimer = reactNativeTimer(duration).pipe(
      switchMapTo(throwError(new TimeoutError()))
    )
    return race(source, timeoutTimer)
  }
}

/**
 * React Native compatible version of interval
 * <strong i="13">@param</strong> {number} duration in ms
 */
export const interval = (duration) => {
  return reactNativeTimer(duration).pipe(
    repeat()
  )
}

Lucunya, semua orang di utas ini mendiskusikan solusi untuk mengabaikan peringatan ini.
Ketika saya dialihkan ke "masalah" ini dari peringatan, saya berharap menemukan dokumentasi yang tepat, menjelaskan "bagaimana?" untuk menanganinya dan sedikit lebih banyak alasan tentang "mengapa?".

#millennials front-end

#Millenial ini ingin menunjukkan bahwa:

  • Kesalahan ini tidak memerlukan dokumentasi, cukup jelas: Anda menyetel waktu lama.
  • Utas ini penuh dengan orang yang membisukan peringatan untuk pustaka yang tidak mereka miliki (mis. Firebase)
  • Seperti yang ditunjukkan oleh diskusi (produktif) di utas ini, ini adalah masalah yang lebih kompleks untuk diperbaiki dalam react-native

Yang mengatakan saya akan menunjukkan lagi masalah ini tidak boleh ditutup, itu ditandai known-issue dan Help Wanted .

Jawaban milenial untuk milenial :)

Kesalahan ini tidak memerlukan dokumentasi, cukup jelas: Anda menyetel waktu lama.

  • Ini bukan kesalahan, peringatannya (jangan tanya saya tentang perbedaan, jika tidak kita harus memulai percakapan filosofis yang mendalam :))
  • Ini sudah berpura-pura didokumentasikan karena memberikan referensi untuk tiket ini, di mana saya perlu membaca banyak komentar alih-alih ringkasan eksekutif (masalah yang diketahui seperti yang sudah Anda sarankan):
    image
  • Saya tidak akan mengatakannya 'cukup jelas'. Konteks tidak cukup tersedia. Secara harfiah, ada dua kalimat dalam sebuah deskripsi.

Yang mengatakan saya akan menunjukkan lagi masalah ini tidak boleh ditutup, itu ditandai masalah yang diketahui dan Dicari Bantuan.

Sangat setuju. Ini akan menghemat waktu bagi banyak orang yang datang dari referensi URL dalam peringatan.

Untuk pengguna firebase / firestore: Saya kembali menggunakan endpoint REST secara langsung untuk panggilan firestore. Karena saya hanya membutuhkan auth dan firestore, itu memecahkan masalah saya dengan cukup mudah. Cuplikan di sini:

https://stackoverflow.com/a/62446792

Saya melakukannya di dalam App () sebagai berikut:

impor {YellowBox} dari 'react-native';
ekspor aplikasi fungsi default () {
YellowBox.ignoreWarnings (['Menyetel pengatur waktu']);
...
...
..
}

Ingat

Apa yang saya lakukan dan itu berhasil dengan saya, tetapi saya tetap tidak tahu apakah itu praktik yang baik atau tidak

Dinavigasi ke file

node_modulesreact-native \ Libraries \ Core \ TimersJSTimers.js

ada fungsi const MAX_TIMER_DURATION_MS = 60 * 1000 dan saya meningkatkan waktu menjadi 60 * 100000 dan itu berhenti muncul

Hai disana,
Masalah ini berusia sekitar 3 tahun dan kami masih memiliki peringatan ini;)
seperti yang dikatakan @RWOverdijk , mengabaikan peringatan bukanlah solusi.
Apakah sudah ada solusi yang saya lewatkan?

Terima kasih <3

Hai semua, kami memutuskan untuk mengunci masalah ini. Saya tahu masalah ini membuat frustrasi banyak dari Anda dan saya ingin meluangkan waktu untuk membantu memahami mengapa kami membuat keputusan ini.

Bagaimana pengatur waktu bekerja di Android di React Native

React Native memiliki implementasi kustom pengatur waktu JS seperti setTimeout . Di Android, cara kerjanya adalah bahwa pengatur waktu JS dilacak di sisi asli, dan sisi asli memutuskan kapan harus memicu pengatur waktu ini. Ini memungkinkan React Native menjadi lebih pintar tentang kapan timer dipicu, dan khususnya bagaimana mereka berhubungan dengan siklus hidup dan rendering aplikasi.

Apa yang terjadi jika saya menyetel pengatur waktu dengan interval yang lama?

Inilah pemahaman saya, dari membaca kode dan mengujinya sedikit:

  1. Jika Anda menyetel pengatur waktu lama, dan aplikasi tetap terbuka selama pengatur waktu aktif, pengatur waktu akan tetap berfungsi.
  2. Jika Anda menyetel pengatur waktu lama, dan ponsel di latar belakang sebelum pengatur waktu selesai, pengatur waktu tidak akan diaktifkan sampai Anda membuka aplikasi di lain waktu.
  3. Ada pengecualian untuk tugas JS headless, yang dapat membuat timer tetap berfungsi meskipun aplikasi berada di latar belakang.

Mengapa kita tidak memanggil pengatur waktu dengan interval yang panjang?

Saya pikir ini terutama masalah kebenaran, dan bukan tentang kinerja. Masalahnya adalah Anda tidak dapat mengandalkan timer lama jika pengguna membuat latar belakang aplikasi Anda.

Jika Anda tidak keberatan pengatur waktu Anda diaktifkan nanti ketika aplikasi berada di latar depan lagi, maka saya pikir mengabaikan peringatan YellowBox adalah ide yang bagus.

Di sisi lain, jika pengatur waktu Anda mengharapkan untuk dipanggil seumur hidup sesi, dan tidak boleh dipicu lagi di latar depan, Anda perlu melakukan sesuatu untuk memastikan pengatur waktu diabaikan di latar depan.

Bagaimana cara menggunakan pustaka pihak ketiga seperti Socket.io dan Firebase yang menyetel timer lama?

Saya tidak tahu detail pustaka pihak ketiga ini. Itu akhirnya bermuara pada pertanyaan di atas. Jika pustaka pihak ketiga ini akan memiliki masalah yang berkaitan dengan pengatur waktu yang diselesaikan di latar depan, maka Anda harus mencari cara untuk memperbaikinya. Beberapa komentar di atas mengusulkan cara melakukan ini untuk Firebase, misalnya. Pada akhirnya, Anda mungkin akan lebih terlayani dengan mengandalkan perpustakaan yang dikembangkan secara khusus dengan React Native dalam pikiran.

Di sisi lain, jika pustaka pihak ketiga tidak memiliki masalah dengan pengatur waktu yang diselesaikan di latar depan, Anda dapat mengabaikan kesalahan tersebut.

Mengapa setTimeout tidak bisa melalui AlarmManager , seperti yang disarankan pada awalnya?

AlarmManager akan mengaktifkan aplikasi jika berada di latar belakang, dan menurut kami pengatur waktu seperti setTimeout akan mengaktifkan aplikasi. Sebagian besar pengatur waktu yang lama ini disetel untuk hal-hal seperti waktu tunggu, dan itu hanya relevan saat aplikasi terbuka. Membangunkan aplikasi di latar belakang itu mahal dan hanya boleh dilakukan jika pengembang secara eksplisit memiliki niat ini.

Pada saat yang sama, banyak orang mungkin membutuhkan sesuatu seperti ini. Kami dapat mengembangkan API untuk itu yang tidak melalui setTimeout . Tetapi karena upaya Lean Core saat ini, kami sebenarnya mencoba menghindari peningkatan permukaan API untuk React Native. Kami pikir ini adalah tugas terbaik yang ditangani oleh pustaka pihak ketiga seperti react-native-background-timer .

Mengapa Anda tidak menghapus peringatan itu seluruhnya?

Kami ingin pengembang mengetahui apa yang sedang terjadi. Jika seseorang menginstal pustaka yang mengandalkan kebenaran setTimeout , kami pikir pengembang harus menyadari bahwa kami tidak dapat menjamin kebenaran ini. Kami ingin menyerahkan kepada masing-masing pengembang untuk membuat keputusan apakah peringatan ini penting dalam kasus penggunaan khusus mereka.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat