簡體   English   中英

屏幕凍結,直到函數返回

[英]The screen freezes till the function returns

在將文件推送到數據庫之前,我需要使用代碼來檢查是否可以訪問互聯網。這是我正在使用的代碼。 如果我有互聯網連接,它就可以正常工作,但如果沒有,它會停頓6或7秒鍾

public static boolean isInternetReachable() throws InterruptedException, IOException {
    Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
    int returnVal = p1.waitFor();
    return  (returnVal==0);
}

我希望它將文件(一個文件一個文件)推入數據庫,並且我想每次都檢查互聯網是否正常工作

要檢查用戶是否連接到互聯網,請使用此功能。

public boolean hasInternetConnection() {
  ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  return manager.getActiveNetworkInfo() != null && manager.getActiveNetworkInfo().isConnected();
}

屏幕凍結,因為您正在主線程上執行長時間運行的任務(上傳文件),這可能導致您的應用程序無法響應。 您必須通過使用AsyncTask,RxJava或Coroutines(Kotlin)將操作移出主線程。 看到這個

 Handler hander = new Handler(this);
 handler.postDelayed(new Runnable() {
        @Override
        public void run() {
        //do what you want
  },2000L);

返回列表的房間查詢<object>凍結應用程序<div id="text_translate"><p>我嘗試使用以下代碼從我的數據庫中加載一些數據並將它們顯示在活動中:</p><pre class="lang-java prettyprint-override"> PhoneNumberViewModel phoneNumberViewModel = new ViewModelProvider(WorksideContactCard.this).get(PhoneNumberViewModel.class); phoneNumberViewModel.getPhoneNumbersById(contactID).observe(this, numbers -&gt; { phoneNumberList = numbers; });</pre><p> 准確地說,我不需要觀察數據的變化,因為如果活動恢復,數據將被刷新。 但是上面的代碼凍結了我的應用程序,盡管我在我的其他 class 中使用AsyncTask訪問數據庫。</p><p> 為什么會這樣?</p><p> 編輯:</p><p> 電話號碼查看型號.class:</p><pre> public class PhoneNumberViewModel extends AndroidViewModel { private PhoneNumberRepository phoneNumberRepository; private LiveData&lt;List&lt;PhoneNumber&gt;&gt; allPhoneNumbers; public PhoneNumberViewModel(@NonNull Application application) { super(application); phoneNumberRepository = new PhoneNumberRepository(application); allPhoneNumbers = phoneNumberRepository.getAllPhoneNumbersLive(); } public void insert(PhoneNumber phoneNumber) { System.out.println("[PhoneNumberRepository] Adding new phoneNumber"); phoneNumberRepository.insert(phoneNumber); } public void update(PhoneNumber phoneNumber) { phoneNumberRepository.update(phoneNumber); } public void delete(PhoneNumber phoneNumber) { phoneNumberRepository.delete(phoneNumber); } public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getAllPhoneNumbers() { return allPhoneNumbers; } public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getPhoneNumbersById(long contactId) throws ExecutionException, InterruptedException { return phoneNumberRepository.getPhoneNumbersByContactId(contactId); }</pre><p> PhoneNumberRepository.class</p><pre> public class PhoneNumberRepository { private PhoneNumberDao phoneNumberDao; private LiveData&lt;List&lt;PhoneNumber&gt;&gt; allPhoneNumbers; private LiveData&lt;List&lt;PhoneNumber&gt;&gt; phoneNumbersByIdList; public PhoneNumberRepository(Application application) { WorksideDatabase database = WorksideDatabase.getInstance(application); phoneNumberDao = database.phoneNumberDao(); allPhoneNumbers = phoneNumberDao.getAllPhoneNumbers(); }... public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getAllPhoneNumbersLive() { return allPhoneNumbers; } public void deleteAllPhoneNumbers() { new DeleteAllPhoneNumbersAsyncTask(phoneNumberDao).execute(); } public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getPhoneNumbersByContactId(long id) throws ExecutionException, InterruptedException { return new SelectPhoneNumberByIdAsyncTask(phoneNumberDao, id).get(); } private static class SelectPhoneNumberByIdAsyncTask extends AsyncTask&lt;Long, Void, LiveData&lt;List&lt;PhoneNumber&gt;&gt;&gt; { private PhoneNumberDao phoneNumberDao; private Long ID; private SelectPhoneNumberByIdAsyncTask(PhoneNumberDao phoneNumberDao, Long contactId) { this.phoneNumberDao = phoneNumberDao; ID = contactId; } @Override protected LiveData&lt;List&lt;PhoneNumber&gt;&gt; doInBackground(Long... contactId) { ID = contactId[0]; return phoneNumberDao.getPhoneNumbersById(ID); } }... }</pre><p> 電話號碼Dao.class:</p><pre> @Dao public interface PhoneNumberDao { @Insert void insert(PhoneNumber phoneNumber); @Update void update(PhoneNumber phoneNumber); @Delete void delete(PhoneNumber phoneNumber); // Probably uneeded method @Query("DELETE FROM phone_numbers_table") void deleteAllPhoneNumbers(); // Delete entry/entries by ID @Query("DELETE FROM phone_numbers_table WHERE id =:phoneNumberId") void deleteByPhoneNumberId(long phoneNumberId); // Retrieve entry/entries by contact ID // @Query("SELECT * FROM phone_numbers_table WHERE contact_id =:contactId") // List&lt;PhoneNumber&gt; getPhoneNumbersById(long contactId); // Retrieve all saved phone numbers in LiveData format @Query("SELECT * FROM phone_numbers_table") LiveData&lt;List&lt;PhoneNumber&gt;&gt; getAllPhoneNumbers(); @Query("SELECT * FROM phone_numbers_table WHERE contact_id =:contactId") LiveData&lt;List&lt;PhoneNumber&gt;&gt; getPhoneNumbersById(long contactId); @Query("SELECT * FROM phone_numbers_table") List&lt;PhoneNumber&gt; getAll(); }</pre></div></object>

[英]Room query that returns List<Object> freezes application

暫無
暫無

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

相關問題 屏幕凍結,應用退出 屏幕鎖定后相機凍結 屏幕解鎖后相機死機 匹配直到函數結束 Android藍牙服務凍結屏幕? 使 for 循環等待方法返回 true 更改文字后我的屏幕凍結 某些用戶的應用程序在啟動畫面上凍結 屏幕鎖定后,相機預覽會凍結 返回列表的房間查詢<object>凍結應用程序<div id="text_translate"><p>我嘗試使用以下代碼從我的數據庫中加載一些數據並將它們顯示在活動中:</p><pre class="lang-java prettyprint-override"> PhoneNumberViewModel phoneNumberViewModel = new ViewModelProvider(WorksideContactCard.this).get(PhoneNumberViewModel.class); phoneNumberViewModel.getPhoneNumbersById(contactID).observe(this, numbers -&gt; { phoneNumberList = numbers; });</pre><p> 准確地說,我不需要觀察數據的變化,因為如果活動恢復,數據將被刷新。 但是上面的代碼凍結了我的應用程序,盡管我在我的其他 class 中使用AsyncTask訪問數據庫。</p><p> 為什么會這樣?</p><p> 編輯:</p><p> 電話號碼查看型號.class:</p><pre> public class PhoneNumberViewModel extends AndroidViewModel { private PhoneNumberRepository phoneNumberRepository; private LiveData&lt;List&lt;PhoneNumber&gt;&gt; allPhoneNumbers; public PhoneNumberViewModel(@NonNull Application application) { super(application); phoneNumberRepository = new PhoneNumberRepository(application); allPhoneNumbers = phoneNumberRepository.getAllPhoneNumbersLive(); } public void insert(PhoneNumber phoneNumber) { System.out.println("[PhoneNumberRepository] Adding new phoneNumber"); phoneNumberRepository.insert(phoneNumber); } public void update(PhoneNumber phoneNumber) { phoneNumberRepository.update(phoneNumber); } public void delete(PhoneNumber phoneNumber) { phoneNumberRepository.delete(phoneNumber); } public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getAllPhoneNumbers() { return allPhoneNumbers; } public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getPhoneNumbersById(long contactId) throws ExecutionException, InterruptedException { return phoneNumberRepository.getPhoneNumbersByContactId(contactId); }</pre><p> PhoneNumberRepository.class</p><pre> public class PhoneNumberRepository { private PhoneNumberDao phoneNumberDao; private LiveData&lt;List&lt;PhoneNumber&gt;&gt; allPhoneNumbers; private LiveData&lt;List&lt;PhoneNumber&gt;&gt; phoneNumbersByIdList; public PhoneNumberRepository(Application application) { WorksideDatabase database = WorksideDatabase.getInstance(application); phoneNumberDao = database.phoneNumberDao(); allPhoneNumbers = phoneNumberDao.getAllPhoneNumbers(); }... public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getAllPhoneNumbersLive() { return allPhoneNumbers; } public void deleteAllPhoneNumbers() { new DeleteAllPhoneNumbersAsyncTask(phoneNumberDao).execute(); } public LiveData&lt;List&lt;PhoneNumber&gt;&gt; getPhoneNumbersByContactId(long id) throws ExecutionException, InterruptedException { return new SelectPhoneNumberByIdAsyncTask(phoneNumberDao, id).get(); } private static class SelectPhoneNumberByIdAsyncTask extends AsyncTask&lt;Long, Void, LiveData&lt;List&lt;PhoneNumber&gt;&gt;&gt; { private PhoneNumberDao phoneNumberDao; private Long ID; private SelectPhoneNumberByIdAsyncTask(PhoneNumberDao phoneNumberDao, Long contactId) { this.phoneNumberDao = phoneNumberDao; ID = contactId; } @Override protected LiveData&lt;List&lt;PhoneNumber&gt;&gt; doInBackground(Long... contactId) { ID = contactId[0]; return phoneNumberDao.getPhoneNumbersById(ID); } }... }</pre><p> 電話號碼Dao.class:</p><pre> @Dao public interface PhoneNumberDao { @Insert void insert(PhoneNumber phoneNumber); @Update void update(PhoneNumber phoneNumber); @Delete void delete(PhoneNumber phoneNumber); // Probably uneeded method @Query("DELETE FROM phone_numbers_table") void deleteAllPhoneNumbers(); // Delete entry/entries by ID @Query("DELETE FROM phone_numbers_table WHERE id =:phoneNumberId") void deleteByPhoneNumberId(long phoneNumberId); // Retrieve entry/entries by contact ID // @Query("SELECT * FROM phone_numbers_table WHERE contact_id =:contactId") // List&lt;PhoneNumber&gt; getPhoneNumbersById(long contactId); // Retrieve all saved phone numbers in LiveData format @Query("SELECT * FROM phone_numbers_table") LiveData&lt;List&lt;PhoneNumber&gt;&gt; getAllPhoneNumbers(); @Query("SELECT * FROM phone_numbers_table WHERE contact_id =:contactId") LiveData&lt;List&lt;PhoneNumber&gt;&gt; getPhoneNumbersById(long contactId); @Query("SELECT * FROM phone_numbers_table") List&lt;PhoneNumber&gt; getAll(); }</pre></div></object>
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM