2012-07-09 1 views
0

코드는 현재 네트워크에 연결되어있을 때 데이터베이스에 데이터를 성공적으로 제출했습니다. 내 앱은 실외에서 사용되는 앱이며, 셀 서비스가 매우 부족한 곳에서 자주 사용됩니다.HTTP POST가 온라인 일 때까지 지연됩니다.

제 질문은 활성 네트워크 연결이있을 때까지 HTTP Post를 지연시키는 가장 좋은 방법은 무엇입니까? 연결이 가능할 때 경고를받는 연결이없는 경우 실행되는 서비스를 만들어야합니까? 전송되는 데이터는 1 킬로바이트 정도로 작기 때문에 기기가 온라인 상태가 될 때까지 앱에 저장 한 다음 데이터를 제출하면됩니다. 이게 효과가있는 것 같니?

더 좋지 않은 또 다른 옵션은 제출 대기중인 데이터와 제출할 활성 연결이있는 경우 앱에 데이터를 저장하고 시작될 때마다 확인하는 것입니다.

현재 데이터를 제출해야하는 코드는 다음과 같습니다. 제안 사항이 있으시면 환영받을만한 것 이상입니다.

String setPost(Context context) 
{ 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(context.getResources().getString(R.string.url)); 

    try 
    { 
     List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(22); 

     nameValuePairs.add(new BasicNameValuePair("month", "7")); 

     ... etc ... 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 

     InputStream is = response.getEntity().getContent(); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     ByteArrayBuffer baf = new ByteArrayBuffer(20); 

     int current = 0; 

     while ((current = bis.read()) != -1) 
     { 
      baf.append((byte)current); 
     } 

     Toast.makeText(context, "thank you for submitting!", Toast.LENGTH_LONG).show(); 

     return new String(baf.toByteArray()); 

    } 
    catch (ClientProtocolException e) 
    { 
     Log.e(this.toString(), "fail: " + e); 
     Toast.makeText(context, "submission failed :(\n please report the error below to developer\n" + e.toString(), Toast.LENGTH_LONG).show(); 
     return ("fail: " + e); 
    } 
    catch (IOException e) 
    { 
     Log.e(this.toString(), "fail: " + e); 
     Toast.makeText(context, "submission failed :(\n please report the error below to developer:\n" + e.toString(), Toast.LENGTH_LONG).show(); 
     return ("fail: " + e); 
    } 

답변

2

은 내가 연결을 사용할 때 경고한다 아무 관련이없는 경우 실행되는 서비스를 만들어야합니까?

예. 모든 네트워크 요청을 처리하려면 IntentService을 사용하십시오. Activity이 아무 것도 업로드/다운로드하려고하면 해당 요청을 IntentService으로 전달합니다. 네트워크에 연결되어 있지 않으면 요청이 대기하고 IntentService이 종료됩니다.

또한 네트워크 연결 변경을 '수신 대기'하는 주류에 등록 된 BroadcastReceiver을 만듭니다. 변경이 '연결됨'상태 인 경우 대기열에있는 네트워크 요청을 처리하고 다시 자동 종료되는 IntentService을 시작해야합니다.

내 경험으로는 효율적이고 효과적입니다.