2013-09-07 2 views
1

내 응용 프로그램은 HTTP 게시 요청을하는 경우가 꽤 있습니다. 테스트 도중 사용자가 비행기 모드에있을 때이 요청이 이루어지면 앱이 다운되는 것을 발견했습니다. 따라서이 상황을 우아하게 처리하려는 노력의 일환으로 AsyncTask 호출을 수행하기 전에 전화가 비행기 모드인지 여부를 테스트하는 함수를 호출합니다. 함수가 true를 반환하면 AsyncTask 호출을하지 않습니다.HTTP 요청으로 비행기 모드 처리

테스트 자체가 올바르게 작동합니다. 사용자는 비행기 모드를 끄고 돌아와 다시 시도해야한다는 통보를받습니다. 문제는 비행기 모드가 꺼지고 AsyncTask이 진행되면 내 HTTP 게시물이 앱을 중단한다는 것입니다. 비행기 모드가 처음에는 켜지지 않으면 모든 것이 원활하게 진행됩니다.

나는 무엇을해야할지 알 수 없습니다. 비행기 모드를 테스트하는 더 좋은 방법이 있습니까? 또는 HTTP 요청이 성공할 수 있도록 시스템 상태를 복원하기 위해 AsyncTask을 차단 한 후 다른 작업이 필요합니다.

모든 조언을 주시면 감사하겠습니다. 다음은이를 좀더 명확하게하기위한 코드입니다. 도움이 될 추가 코드가 있으면 알려 주시기 바랍니다. 감사! 당신은 비행기 모드에서 무선 랜을 가질 수 있기 때문에 혼자 아마 좋은 생각이 아니다

public class UserFunctions { 

      @SuppressLint("NewApi") 
      @SuppressWarnings("deprecation") 
      public boolean isAirplaneModeOn(Context context) { 

       if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){ 
        return Settings.Global.getInt(context.getContentResolver(), 
         Settings.Global.AIRPLANE_MODE_ON, 0) != 0; 
       } else { 
        return Settings.System.getInt(context.getContentResolver(), 
          Settings.System.AIRPLANE_MODE_ON, 0) != 0; 
       } 

      } 

      public void warnAboutAirplaneMode(Context context) { 

       AlertDialog.Builder builder = new AlertDialog.Builder(context) 
        .setTitle("Airplane Mode Is On") 
        .setIcon(R.raw.airplane_mode) 
        .setCancelable(false) 
        .setMessage("Your phone is in airplane mode. Please turn this off then try again.") 

        .setNeutralButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 

        }); 

       AlertDialog alert = builder.create(); 
       alert.show(); 
      } 

     } 
+2

네트워크에 문제가 많지 않습니까? 사용자는 여전히 비행기 모드에서 Wi-Fi를 사용할 수 있습니다. 문제가 올바르게 이해되면 네트워크 연결이 가능한지 확인해야합니다. – snotyak

+0

좋은 지적. 내 생각 엔 당신이 맞다. – Alex

답변

1

Airplane mode에 대한 확인 : 여기

public class LoginActivity extends Activity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_login); 

      context = this; 

      btnLogin.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
       UserFunctions userFunction = new UserFunctions(context); 
       if (userFunction.isAirplaneModeOn(context)) { 
        userFunction.warnAboutAirplaneMode(context); 
        return; 
       } 

       new Login().execute(); 

      }); 
    } 

    class Login extends AsyncTask<String, String, String> { 

     private JSONParser jsonParser = new JSONParser(); 
     private JSONObject json; 

     @Override 
     protected String doInBackground(String... args) { 

      String URL = context.getResources().getString(R.string.dbURL) + context.getResources().getString(R.string.attemptLogin_php); 

        //this next line is the one that crashes - iff the user was 
        // previously in airplane mode. If there weren't ever in airplane 
        // mode, this runs just fine 
      json = jsonParser.makeHttpRequest(URL, params); 

        ... 

    } 
} 

는 UserFunctions 클래스입니다. 그러나이이 아마 몇 가지 가능한 대답은하지만 내가하는 일은 등록 다음과 같은 권한을 가진 네트워크 상태 변화에 대한 수신 대기 BroadcastReceiver입니다

내 수신기가 매니페스트

<receiver android:name="com.example.NetworkReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 
에서 다음과 같습니다

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

그 해고 될 때 나는 네트워크 연결이 있는지 여부를 확인하고 SharedPreferences에 앱을 넓은 부울로 유지하고 HTTP 호출을하기 전에 매번 부울을 확인합니다.

사용자가 수신 상태가 좋지 않고 연결 시간이 초과 된 SocketTimeOutExceptions과 같이 문제를 완전히 해결할 수없는 경우가 있습니다.

+0

이것은 좋은 생각 인 것 같습니다. NetworkReceiver가 작동하는 데 문제가 있습니다. 나는 이것이 비행기 모드 변경을 위해 발사되지 않을 수도 있다고 우려하고있다. 또한 네트워크 연결에서 변경 사항을 트래핑 할 수있는 동안 연결이 다시 설정되면 http 게시 작업이 null로 되돌아 오는 근본적인 문제를 해결하지 못할 수도 있습니다. 나는 이것을 밖으로 시도하고 다시 게시 할 것입니다. 제안 해 주셔서 감사합니다! – Alex

+1

대단히 감사합니다. 저는 이것을 답으로 표시했으나, 다른 사람들의 이익을 위해이 점에 대해 언급해야합니다. 이 접근 방식의 문제점은 브로드 캐스트 리시버가 연결 변경을 알리기 전에 1 분 이상이 걸리므로 사용자가 오프라인 상태가 될 수 있지만 브로드 캐스트 리시버 전에 네트워크 작업을 호출 할 가능성이 있습니다. 공유 환경 설정을 업데이트합니다. 이 경우 널 포인터 예외가 발생할 수 있으므로이 시나리오를 처리해야합니다. 충고가 있다면 그 말을 듣고 싶습니다. 감사! – Alex

+0

브로드 캐스트 수신자가 전화에 의존하는 데 걸리는 시간 은하계 넥서스에서 초 단위로 실행되지만 드로이드 x2와 같은 오래된 전화기에서는보고있는 것처럼 최대 1 분 정도 걸릴 수 있습니다. – tyczj

관련 문제