2017-12-08 4 views
0

다음과 같은 상황이 있습니다.Firestore 질문을하기 전에 인터넷 데이터 연결을 확인하십시오.

응용 프로그램에는 사용자의 게시물을 좋아하는 옵션이 있습니다. 또한 Dislike 옵션도 있습니다.

Wi-Fi 또는 모바일 네트워크에 연결되어 있으면 제대로 작동합니다 (온라인 연결시).

문제 :

네트워크가 이동하면, 그것은 종종 연결되어 있지만 데이터 전송이 없으며 작동하지 않습니다됩니다. 이는 특정 지역의 지리적 및 운영자 문제입니다.

Like 옵션이 Like 또는 DisLike에 영향을 주려면 시간이 오래 걸립니다.

코드 :

@Override 
    public void onLikeSelected(final DocumentSnapshot like) { 

     if (checkConnection()){ 


      final String idCurrentUser = mCurrentUser.getUid(); 

      Task<QuerySnapshot> query = mDb.collection("Postagens").document(like.getId()).collection("Likes").whereEqualTo("id_userLike", idCurrentUser) 
        .get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { 
         @Override 
         public void onSuccess(QuerySnapshot documentSnapshots) { 

          if(documentSnapshots.size() == 0) { 

           Map<String, Object> dado_usuario = new HashMap<>(); 
           dado_usuario.put("id_userLike", mCurrentUser.getUid()); 
           dado_usuario.put("timestamp", FieldValue.serverTimestamp()); 

           mDb.collection("Postagens").document(like.getId()).collection("Likes").document(idCurrentUser).set(dado_usuario).addOnCompleteListener(new OnCompleteListener<Void>() { 
            @Override 
            public void onComplete(@NonNull Task<Void> task) { 



            } 
           }); 



          } else { //utilizando else 



           mDb.collection("Postagens").document(like.getId()).collection("Likes").document(idCurrentUser).delete().addOnSuccessListener(new OnSuccessListener<Void>() { 
            @Override 
            public void onSuccess(Void aVoid) { 



            } 
           }); 

          } 


         } 
        }); 



     } else { 

      Toast.makeText(getActivity(), "Not Connection", Toast.LENGTH_SHORT).show(); 
     } 

} 

public boolean checkConnection() { 
     boolean conectado; 
     ConnectivityManager conectivtyManager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (conectivtyManager.getActiveNetworkInfo() != null 
       && conectivtyManager.getActiveNetworkInfo().isAvailable() 
       && conectivtyManager.getActiveNetworkInfo().isConnected()) { 
      conectado = true; 
     } else { 
      conectado = false; 
     } 
     return conectado; 
} 

모바일 연결이 잘못되었거나 약한 때 나는이 작업을 수행 할 수있는 방법

는 데이터 연결을 처리하거나 치료를 변경하는 경우 될 경우 나도 몰라 Firestore 데이터베이스의 Like (onLikeSelected()) 옵션.

감사합니다.

답변

0

간단한 승인은 다음 방법을 사용합니다 :

public boolean isInternetAvailable() { 
    Runtime runtime = Runtime.getRuntime(); 
    try { 
     Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int exitValue = process.waitFor(); 
     return (exitValue == 0); 
    } catch (IOException | InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

실례합니다. 이것이 무엇을 할 것인지 설명해 주시겠습니까? @AlexMamo – TiagoIB

+0

이 방법은 인터넷 연결을 확인합니다. 이게 니가 원하는거야? –

+0

예, 정확하게 그 것입니다. 내가 (첫 번째 대답에서) 어떻게 테스트했는지 알 수 있듯이 연결이 연결됩니다. 그리고 귀하의 예에 따르면, 장치가 전송 중인지 테스트하십시오. 그 차이가 있습니까? @AlexMamo – TiagoIB

0

는 예에서 확인되어이 일을 할 수있는 두 가지 방법이 있고 다른 하나는 방송 수신기

public static boolean internetAvailable(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = null; 
    if (connectivityManager != null) { 
     activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    } 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

그리고 다른 하나

public class NetworkChangeReceiver extends BroadcastReceiver { 
public static final String TAG = "NetworkChangeReceiver"; 
public static ConnectivityReceiverListener connectivityReceiverListener; 

public NetworkChangeReceiver() { 
    super(); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = null; 
    if (cm != null) { 
     activeNetwork = cm.getActiveNetworkInfo(); 
    } 
    boolean isConnected = activeNetwork != null 
      && activeNetwork.isConnectedOrConnecting(); 

    if (connectivityReceiverListener != null) { 
     connectivityReceiverListener.onNetworkConnectionChanged(isConnected); 
    } 
} 

public interface ConnectivityReceiverListener { 
    void onNetworkConnectionChanged(boolean isConnected); 
} 

}

해피을하고있다 코딩 :

+0

어떻게 현재 코드에서 사용할 수 있습니까? @ShivamMathur – TiagoIB

+0

인터넷 연결이 작동하는지 여부는 확인할 수 없지만 일부 사용자는 핑 (ping)을하고 응답 시간이 5 초를 초과하면 인터넷 속도가 느린 지 확인합니다. 그러나이 접근법은 여러 상황에서 실패하므로 코드를 바꿀뿐입니다. ** if (checkConnection()) ** to ** if (internetAvailable (context)) ** –

+0

실례지만, 다소 혼란 스러웠습니다. 당신은 나를 5 초 동안 테스트하거나 if (internetAvailable (context)) 메소드를 사용하고 있습니까? @ ShivamMathur – TiagoIB

관련 문제