Подтвердить что ты не робот

Как начать обслуживание в новом потоке в android

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

        getApplicationContext().bindService(
        new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class),
        serviceConnection,
        Context.BIND_AUTO_CREATE
    );

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

         onServiceConnected(ComponentName className, IBinder service){ ..}

называется back.so, я искал об этом. я узнал, что мне нужно начать работу в новой теме. поэтому, пожалуйста, помогите мне в этом.

4b9b3361

Ответ 1

Чтобы создать и запустить новый поток, изнутри действия, вы можете сказать:

Thread t = new Thread(){
public void run(){
getApplicationContext().bindService(
        new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class),
        serviceConnection,
        Context.BIND_AUTO_CREATE
    );
}
};
t.start();

Кроме того, кешируйте значение, возвращаемое bindservice, если оно есть, если оно требуется для последующего использования.

Ответ 2

Любое решение, которое использует Threads, Runnables, AsyncTask или иным образом с Сервисом, будет иметь общую проблему.

Служба блокирует вызывающую активность до тех пор, пока служба не будет запущена. И, таким образом, эффективно не обрабатывает службу в определенных случаях.

Решением этого является использование подкласса IntentService.

Пример реализации:

public class MyCustomService extends IntentService 
{   
    private DatabaseAdapter mAdapter;

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        super.onStartCommand(intent, flags, startId);
        Toast.makeText(this, "MyCustomService Started", Toast.LENGTH_LONG).show();

        // Don't let this service restart automatically if it has been stopped by the OS.
        return START_NOT_STICKY;
    }

    @Override
    protected void onHandleIntent(Intent intent) 
    {
        Toast.makeText(this, "MyCustomService Handling Intent", Toast.LENGTH_LONG).show();
        // INSERT THE WORK TO BE DONE HERE
    }
}

onCreate() и onDestroy также могут быть переопределены, если внутри них вызывается super.onWhatever().

Ответ 3

Старый вопрос, но я отвечаю, потому что кто-то обратил мое внимание на него в другом вопросе.

Проблема OP, очевидно, была вызвана тем, что служба onBind(...) занимает много времени и блокирует основной поток. Правильное решение не делает этого. Сервис необходимо переделать, чтобы onBind(...) быстро возвращался. Как и все остальное в Android API, вы всегда должны вызывать bindService(...) в основном потоке.

Причина в том, что безопасность потоков в Java не просто вопрос атомарности, но и видимость. (Прокрутите вниз до раздела видимости.) В общем, вы всегда должны предполагать, что каждый Java API не является потокобезопасным, если он явно не документирован иначе.

Ответ 4

если кто-либо читает это, ищет решение, в котором будет поддерживаться поток пользовательского интерфейса в бегстве, лучше проверить AsyncTask здесь. веселит.