2014-02-21 50 views
0

我有以下用於檢查Web API的服務。這項服務爲什麼停止?

該實現是爲了在發出通知之前重試HTTP請求5次。

無論如何,似乎服務只是在第一次嘗試後停止。

請問這是怎麼回事?

public class CreditcheckService extends IntentService { 
    public CreditcheckService() { 
    super("CreditcheckService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    String phone = ""; 
    phone = intent.getStringExtra("phone"); 
    checkcreditonline(phone); 
    Log.e("inizio il service","inizio il service"); 

} 

private void checkcreditonline(final String phone) { 
    final Handler h = new Handler(); 

    final JsonHttpResponseHandler jsonHttpResponseHandler = new JsonHttpResponseHandler() { 
     private int counter = 0; 

     @Override 
     public void onSuccess(JSONObject arg0) { 
      int cazzo=0; 
      cazzo++; 
      try { 
       String status = arg0.getString("credit"); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      try { 
       String status = arg0.getString("error"); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onFailure(Throwable arg0) { 
      //IF FAILED SHOULD RETRY, BUT IT DOESN'T 
      if (counter < 5) { 
            //HERE THE SUCCESSIVE ATTEMPTS 
       h.postDelayed(new WebserviceRunnable(this, phone), 5000); 
      } else { 

       NotificationCompat.Builder mBuilder = 
         new NotificationCompat.Builder(CreditcheckService.this) 
         .setSmallIcon(R.drawable.icon) 
         .setContentTitle(getResources().getString(R.string.unable_to)) 
         .setContentText(getResources().getString(R.string.please_connect)); 
       mBuilder.setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0)); 
       NotificationManager mNotificationManager = 
         (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(999, mBuilder.build()); 
      } 
      counter++; 
     } 
    }; 

    h.post(new WebserviceRunnable(jsonHttpResponseHandler, phone)); 
} 

private class WebserviceRunnable implements Runnable { 
    private JsonHttpResponseHandler jsonHttpResponseHandler; 
    private String email; 

    public WebserviceRunnable(
      JsonHttpResponseHandler jsonHttpResponseHandler, String aEmail) { 
     this.jsonHttpResponseHandler = jsonHttpResponseHandler; 
     this.email = aEmail; 
    } 

    public void run() { 
     try { 
      WebServiceApi.get(
        "rest/credit/get/" + URLEncoder.encode(email, "utf-8"), 
        null, jsonHttpResponseHandler); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

+1

可以請你檢查你的logcat的任何異常左右? 請發佈您的logcat –

+0

@Atish Agrawal謝謝Atish沒有在Logcat中: - ((( –

+0

)在'public void onFailure(Throwable arg0)'的開始處記錄可丟棄的權限,只是爲了檢查它是否到達 – injecteer

回答

1

onHandleIntent在IntentService是異步的。

當onHandleIntent退出時,服務停止。

所以不要將消息發佈到處理程序,而是直接在checkcreditonline()中執行。

+0

感謝Doctoror Drive,我不確定我是否理解,我沒有使用任何Handler,任何異步工作我在做'checkcreditonline(final String phone' –

+0

IntentService在新線程中調用每個onHandleIntent,當所有的onHandleIntent退出時,服務停止,當你在checkcreditonline中調用handler.post時,checkcreditonline方法退出,然後onHandleIntent退出,而Handler Runnable開始執行這項工作。移除處理程序並放入在checkcreditonline中WebserviceRunnable的void run()代碼使服務等待完成。 –