2016-08-22 13 views
0

我正在嘗試使用來自Firebase的詳細信息填充我的活動。我希望首先打開該活動,然後在微調自動填充之前獲取細節時,微調器會顯示該活動。現在發生的事情就像它試圖在打開頁面之前加載活動細節,從而導致UI滯後。這就是我下面讓我的活動等到活動細節獲得

碼這是在做上創建

waitForDetails(); 
     ObscuredSharedPreferences mySubscription = ObscuredSharedPreferences.getPrefs(getApplicationContext(), "MySubscription", MODE_PRIVATE); 
     final ObscuredSharedPreferences.Editor editorSub = mySubscription.edit(); 
     String end = mySubscription.getString("EndSub", null); 
     String last = mySubscription.getString("LastSub", null); 
     endSubView.setText(end); 
     lastSubView.setText(last); 
     subDiffView.setText(dateConvert()+" "+getString(R.string.days_manage)); 
     subDiffView.setGravity(Gravity.CENTER); 
     spin.setVisibility(View.GONE); 
     layout.setVisibility(View.VISIBLE); 

這是waitForDetails方法

private void waitForDetails(){ 
    final Handler handler = new Handler(); 

    final Runnable r = new Runnable() { 
     public void run() { 
      ObscuredSharedPreferences pref = ObscuredSharedPreferences.getPrefs(getApplicationContext(), "MyPref", MODE_PRIVATE); 
      final ObscuredSharedPreferences.Editor editor = pref.edit(); 
      final String userName = pref.getString("Username", null); 
      ObscuredSharedPreferences mySubscription = ObscuredSharedPreferences.getPrefs(getApplicationContext(), "MySubscription", MODE_PRIVATE); 
      final ObscuredSharedPreferences.Editor editorSub = mySubscription.edit(); 
      editorSub.clear(); 
      editorSub.apply(); 

      Firebase ref = new Firebase(Config.FIREBASE_URL); 
      ref.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 

        User user = snapshot.child(userName).getValue(User.class); 

        String endSub = user.getEndSubscription(); 
        String lastSub = user.getLastSubscription(); 

        editorSub.clear(); 
        editorSub.apply(); 
        editorSub.putString("EndSub", endSub); 
        editorSub.putString("LastSub", lastSub); 
        editorSub.apply(); 



       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 
        System.out.println("The read failed: " + firebaseError.getMessage()); 
       } 
      }); 
      handler.postDelayed(this, 1000); 
     } 
    }; 

    handler.postDelayed(r, 1000); 
} 

回答

0

使用的AsyncTask ..

聲明一個的AsyncTask,然後簡單地顯示ProgressDialog AsyncTask的方法。花時間和應用程序來凍結,例如從doInBackground()中檢索Link中的數據。檢索到的帖子鏈接是否在asyncTask的onPostExecute()方法中工作,並解僱ProgressDialog。 AsyncTask在與主要活動不同的線程上運行,因此應用程序不會凍結。

你可以調用的AsyncTask類像

waitForDetails.execute();

//異步任務

class waitForDetails extends AsyncTask<String, Void, Integer> { 
    protected void onPreExecute() { 
     progress = ProgressDialog.show(context, "", "Loading ...", 
       false, true); 
    } 

    @Override 
    protected Integer doInBackground(String... params) { 
     // Your Code Which freezes activity 

    } 

    protected void onPostExecute(Integer result) { 

     if (progress != null) { 
      progress.dismiss(); 
     } 
     // do code you want to execute after doInBackground() finished. 
    } 
} 
+0

時遇到了爲Am在sharedprefrence節省一些價值觀的問題,價值觀從火力得到現在它不等待得到我的值,然後在共享首選項中首先保存它,然後再執行 – Henry

+0

'waitForDetails.execute();'應該是最後一條語句,並且共享首選項中的數據保存代碼在'onPostExecute()'方法中移動。意味着你在'waitForDetails.execute();'在'onPostExecute()'中移動後使用的代碼。 – user392117