2015-12-31 4 views
0

У меня есть служба, которая работает в фоновом режиме. Он зарегистрирован в манифесте. Когда я передаю пару строк к нему из своей активности и запустил его, цель будет равна нулю. Я проверил строки, и они не являются нулевыми, прежде чем они будут отправлены в службу. Любая идея, почему намерение является нулевым? Вот этот фрагмент.Android-сервис Intent is null

   Intent iniupdates = new Intent(MapActivity.this, InitialLocationUpdater.class); 
       iniupdates.setAction("mypackage.InitialLocationUpdater"); 
       iniupdates.putExtra(InitialLocationUpdater.PARAM_IN_PAS, psgr); 
       iniupdates.putExtra(InitialLocationUpdater.PARAM_IN_DRI, tok); 
       //iniupdates.putExtra("lat", la); 
       //iniupdates.putExtra("lon", lo); 
       Log.e("testma600", tok + psgr); 
       startService(iniupdates); 

Вот onstartCommand метод службы

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     try { 
      if (null == intent || intent.equals(null) || intent.getData() == null){Log.e("Log", "the intent in onStartCommand is null");} 
      else if (intent.getStringExtra(PARAM_IN_PAS) != null && intent.getStringExtra(PARAM_IN_DRI) != null && mLastLocation != null) { 
      pass = intent.getStringExtra(PARAM_IN_PAS); 
      driv = intent.getStringExtra(PARAM_IN_DRI); 
      //String lat = intent.getStringExtra("lat"); 
      //String lon = intent.getStringExtra("lon"); 
      sendLocation(driv, String.valueOf(mLastLocation.getLatitude()), String.valueOf(mLastLocation.getLongitude()), pass); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
      Log.e("ERROR", driv + String.valueOf(mLastLocation.getLatitude())); 
     } 
     return START_NOT_STICKY; 
    } 

Я также увидеть следующее исключение на BufferReader линии в трассировке стека, который я разместил вниз.

@Override 
      protected Void doInBackground(String... args) { 
       try { 
        try { 
         URL url; 
         HttpURLConnection urlConn; 
         url = new URL ("serverurl"); 
         urlConn = (HttpURLConnection)url.openConnection(); 
         urlConn.setDoInput (true); 
         urlConn.setDoOutput (true); 
         urlConn.setUseCaches (false); 
         urlConn.setRequestProperty("Content-Type","application/json"); 
         urlConn.setRequestProperty("Accept", "application/json"); 
         urlConn.setChunkedStreamingMode(0); 
         urlConn.setRequestMethod("POST"); 
         urlConn.connect(); 

         //Create JSONObject here 
         JSONObject json = new JSONObject(); 
         json.put("drtoken", args[0]); 
         json.put("drlat", args[1]); 
         json.put("drlon", args[2]); 

         String postData=json.toString(); 

         // Send POST output. 
         OutputStreamWriter os = new OutputStreamWriter(urlConn.getOutputStream(), "UTF-8"); 
          os.write(postData); 
          Log.i("NOTIFICATION", "Data Sent"); 
          os.close(); 

         BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); 
         String msg=""; 
         String line = ""; 
         while ((line = reader.readLine()) != null) { 
          msg += line; } 
         Log.i("msg=",""+msg); 
        } catch (MalformedURLException muex) { 
         // TODO Auto-generated catch block 
         muex.printStackTrace(); 
        } catch (IOException ioex){ 
         ioex.printStackTrace(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
        Log.e("ERROR", "There is error in this code " + String.valueOf(args[0])); 

       } 
       return null; 
      } 

Это трассировка стека.

12-31 13:30:49.627 12185-12451/mypackage W/System.err: java.net.ConnectException: failed to connect to /192.168.0.44 (port 80): connect failed: ETIMEDOUT (Connection timed out) 
12-31 13:30:49.638 12185-12451/mypackage W/System.err:  at libcore.io.IoBridge.connect(IoBridge.java:114) 
12-31 13:30:49.638 12185-12451/mypackage W/System.err:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
12-31 13:30:49.638 12185-12451/mypackage W/System.err:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:460) 
12-31 13:30:49.641 12185-12451/mypackage W/System.err:  at java.net.Socket.connect(Socket.java:833) 
12-31 13:30:49.641 12185-12451/mypackage W/System.err:  at com.android.okhttp.internal.Platform.connectSocket(Platform.java:131) 
12-31 13:30:49.642 12185-12451/mypackage W/System.err:  at com.android.okhttp.Connection.connect(Connection.java:101) 
12-31 13:30:49.643 12185-12451/mypackage W/System.err:  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 
12-31 13:30:49.643 12185-12451/mypackage W/System.err:  at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
12-31 13:30:49.644 12185-12451/mypackage W/System.err:  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
12-31 13:30:49.644 12185-12451/mypackage W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
12-31 13:30:49.645 12185-12451/mypackage W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89) 
12-31 13:30:49.648 12185-12451/mypackage W/System.err:  at mypackage .MapActivity$PostData.doInBackground(MapActivity.java:1241) 
12-31 13:30:49.649 12185-12451/mypackage W/System.err:  at mypackage .MapActivity$PostData.doInBackground(MapActivity.java:1223) 
12-31 13:30:49.650 12185-12451/mypackage W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
12-31 13:30:49.651 12185-12451/mypackage W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
12-31 13:30:49.652 12185-12451/mypackage W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
12-31 13:30:49.652 12185-12451/mypackage W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
12-31 13:30:49.653 12185-12451/mypackage W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
12-31 13:30:49.656 12185-12451/mypackage W/System.err:  at java.lang.Thread.run(Thread.java:841) 
12-31 13:30:49.657 12185-12451/mypackage W/System.err: Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 
12-31 13:30:49.658 12185-12451/mypackage W/System.err:  at libcore.io.Posix.connect(Native Method) 
12-31 13:30:49.662 12185-12451/mypackage W/System.err:  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
12-31 13:30:49.663 12185-12451/mypackage W/System.err:  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
12-31 13:30:49.664 12185-12451/mypackage W/System.err:  at libcore.io.IoBridge.connect(IoBridge.java:112) 
12-31 13:30:49.664 12185-12451/mypackage W/System.err: ... 18 more 
+0

Как передано Intent null, если показано, что stacktrace имеет значение «не удалось подключиться к /192.168.0.44 (порт 80): connect failed: ETIMEDOUT (Connection time out)»? –

ответ

0

Оказывается, sendLocation() метод делает длительный процесс в службы, и в результате система выбрасывает исключение networkonmainthread, что является основной проблемой. Основываясь на the accepted answer in this SO question, я создал новый класс AsyncTask, вложенный в класс обслуживания, и выполнил все мои длительные операции. Теперь у меня больше нет нулевого намерения. Однако я не понимаю, почему. Я бы никогда не догадался через миллион лет, что за этим могло произойти исключение networkonmainthread. Спасибо всем за помощь. Теперь я собираюсь праздновать новые годы :). С Новым годом 2016

1

Трассировка стека говорит, что URL-адрес недействителен! и соединение не выполнено (время ожидания подключения).

В вашем коде вы обработали нулевой смысл.

if (null == intent || intent.equals(null) || intent.getData() == null){Log.e("Log", "the intent in onStartCommand is null");} 

на первом этапе, пожалуйста, проверьте URL-адрес. Для передачи данных в службу, изменяется создать намерение, как это:

Intent iniupdates = new Intent(MapActivity.this, InitialLocationUpdater.class); 
Bundle bundle = new Bundle();   
bundle.putString(InitialLocationUpdater.PARAM_IN_PAS, psgr);   
bundle.putString(InitialLocationUpdater.PARAM_IN_DRI, tok); 

iniupdates.putExtras(bundle); 
startService(iniupdates); 

В вашем использовании услуг ниже код для извлечения данных:

Bundle bundle = intent.getExtras(); 

if (bundle != null) 
{ 
    String psgr = bundle.getString(PARAM_IN_PAS); 
    String tok = bundle.getString(PARAM_IN_DRI); 
} 
+0

Я хотел бы запустить службу из mapactivity, в которой вложена в asyncTask. Класс службы находится в отдельном java-файле. AsyncTask здесь не имеет никакого отношения к запуску службы. –

+0

@ The_Martian Я редактирую свой ответ. – Fred

+0

Я ценю вашу помощь. Тем не менее, я все еще получаю нулевой смысл. Я предполагаю, что это имеет какое-то отношение к моему другому приложению, отправляющему данные, и, следовательно, запускает asyncTask, у которого уже есть тайм-аут. Это сложнее, чем мои фрагменты. Я работаю над этим, и я уточню, разрешу ли я это. :) –

Смежные вопросы