2012-01-31 2 views
22

Я работаю с android xml rpc для монтирования сервера. Для этого я использую and intentService. Единственная проблема заключается в том, что при запуске класса сервера мой onHandleIntent, который содержит сервер, никогда не вызывается.intentService: почему мой onHandleIntent никогда не называется?

Я сделал некоторые исследования, и я нашел кого-то, кто имел такую ​​же проблему, он сумел решить ее с помощью суперкласс, но я новичок в программировании и не удалось сделать то, что он сделал = =>link

Вот мой код:

package tfe.rma.ciss.be; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlrpc.android.MethodCall; 
import org.xmlrpc.android.XMLRPCServer; 

import android.app.IntentService; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.StringReader; 
import java.net.MalformedURLException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

public class Server extends IntentService { 
    public String myData=""; 
    public String streamTitle = "",path=""; 

    public void onCreate() { 

     Log.d("Server", ">>>onCreate()"); 

    } 

    public Server() { 
     super("Server"); 


    } 
    public void onStart (Intent intent, int startId) { 
     Log.d("Server", ">>>Started()"); } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.d("Server", ">>>handlingIntent()"); 
     try { 
      ServerSocket socket = new ServerSocket(8214); 
      XMLRPCServer server = new XMLRPCServer(); 
      Log.d("Server", ">>>opening on port" + socket); 
      while (true) { 
       Socket client = socket.accept(); 
       MethodCall call = server.readMethodCall(client); 
       String name = call.getMethodName(); 
       if (name.equals("newImage")) { 
        ArrayList<Object> params = call.getParams(); 
        // assume "add" method has two Integer params, so no checks done 
        myData = (String)(params.get(0)); 
        //int i1 = (Integer) params.get(1); 
        server.respond(client, new Object[] {200}); 
        /*intent = new Intent (this, ParseFunction.class); 
       startService (intent); */ 

        Toast.makeText(this, myData, Toast.LENGTH_SHORT).show(); 
        Log.d("ParseFunction", ">>>Started()"); 

        Intent i = new Intent(this, B.class); 

        i.putExtra("Azo", myData); 


        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(i); 

       } else { 
        server.respond(client, null); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } 

    } 

    } 
+1

Обратитесь к [this] (http://mobile.tutsplus.com/tutorials/android/android-fundamentals-intentservice-basics/). –

+0

@ Lalit Poptani: я красная статья, но она не говорит, почему мое намерение onHandle не называется. У меня такой же код :( Я apprciate ваша помощь! – youssoua

ответ

21

В случае, если кто-то хочет получить результат, вот что я должен был сделать. Добавление суперкласса в onCreatesuper.onCreate() и изменить onStart по onStartCommand (плюс его суперкласс super.onStartCommand()), теперь он работает как шарм

package tfe.rma.ciss.be; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlrpc.android.MethodCall; 
import org.xmlrpc.android.XMLRPCServer; 

import android.app.IntentService; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.StringReader; 
import java.net.MalformedURLException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

public class Server extends IntentService { 
    public String myData=""; 
    public String streamTitle = "",path=""; 

    public void onCreate() { 
     super.onCreate(); 
     Log.d("Server", ">>>onCreate()"); 
    } 

    public Server() { 
     super("Server"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, startId, startId); 
     Log.i("LocalService", "Received start id " + startId + ": " + intent); 

     return START_STICKY; 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.d("Server", ">>>handlingIntent()"); 
     try { 
      ServerSocket socket = new ServerSocket(8214); 
      XMLRPCServer server = new XMLRPCServer(); 
      Log.d("Server", ">>>opening on port" + socket); 

      while (true) { 
       Socket client = socket.accept(); 
       MethodCall call = server.readMethodCall(client); 
       String name = call.getMethodName(); 

       if (name.equals("newImage")) { 
        ArrayList<Object> params = call.getParams(); 
        // assume "add" method has two Integer params, so no checks done 
        myData = (String)(params.get(0)); 
        //int i1 = (Integer) params.get(1); 
        server.respond(client, new Object[] {200}); 
        /*intent = new Intent (this, ParseFunction.class); 
        startService (intent); */ 

        Toast.makeText(this, myData, Toast.LENGTH_SHORT).show(); 
        Log.d("ParseFunction", ">>>Started()"); 

        Intent i = new Intent(this, B.class); 
        i.putExtra("Azo", myData); 
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(i); 
       } else { 
        server.respond(client, null); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+1

Вы должны отметить ответ CommonsWare. –

+0

Я действительно действительно нашел решение, где он помог кому-то еще решить проблему. Но это было до того, как он ответил мне там ;-) – youssoua

+0

Этот ответ помогает мне каждый раз :) –

18

Избавьтесь от onStart(). Во-первых, он устарел. Во-вторых, вы не привязываетесь к суперклассу, тем самым препятствуя выполнению своей работы IntentService.

+0

Я избавился от onStart() (заменил его onStartCommand()) и добавил два супер класса ==> теперь он работает как шарм :-) – youssoua

+1

И кстати, я купил вашу книгу, отлично :-) слишком плохо, нет французской версии – youssoua

3

Некоторые из вас могут попасть на эту страницу, потому что ваш метод onHandleIntent() никогда не вызывается, несмотря на вы реализовали все просто хорошо.

Если это ваш первый сервис, который вы пытаетесь протестировать, возможно, вам не известно о важности разрешений. В этом случае проверьте свои разрешения.

Надеюсь, это поможет кому-то.

34

Если вы получили здесь и ничего не получалось, проверить манифест выглядит так:

<service android:name=".subpackage.ServiceClassName" > 
    </service> 

И не нравятся:

<service android:name=".subpackage.ServiceClassName" /> 

Там проблема с закрытием XML-тегами. Первый работает. Второй законный, но не работает.

+0

Две вещи: Действительно? Также, как правило, с intentservice мы хотели бы определить фильтр намерения в любом случае и как таковой обычно заканчиваются первым. – edthethird

+0

Я не думаю, что это имеет значение. Я пробовал с обоими, и в обоих случаях отлично работает. Пока вы объявили Службу в манифесте, не имеет значения, какой из этих двух способов вы используете для объявления. – Rachit

16

У меня была такая же проблема, оказалось, что в объявлении приложения отсутствует определение службы.

Добавление:

<service 
    android:name=".MyIntentServiceName" 
    android:exported="false" /> 

решить эту проблему.

+0

Это была моя проблема! Я бы хотел, чтобы Android выбрал исключение в этой ситуации, потому что для меня это не так, и если бы я не прочитал ваше сообщение, я бы не заметил, что я не объявил свои службы в манифесте ... – user3289695

+0

Спасибо, помог я тоже! 1 – Hardy

+0

У меня было определение, но с неправильным путем. – GroovyDotCom

5

У меня возникла эта проблема, но только на некоторых устройствах, в частности на Motorola Moto G 1st Gen (4,5 "& 4G-less), и решение заключалось в том, чтобы включить FULL PACKAGE NAME в описание сервиса в манифесте.

Так меняется «mypackage.MyService» в «com.android.myapp.mypackage.MyService» решался onHandleIntent никогда не называют

+0

решил мою проблему! –

5

Просто, чтобы подвести итог:. в случае, если переопределить onStartCommand, не забудьте звонок супер:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, startId, startId); 

    return START_STICKY; 
} 

Если нет, проверьте свой манифест, см. Ответ Mister Smith.

0

У меня была та же проблема. Я удалил метод OnCreate и теперь работает как шарм. LMK, если он сработает для вас :)

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