Как начать обслуживание в новом потоке в android
Я новичок в этом андроиде. я использую службу для выполнения некоторых фоновых работ. поэтому я запускаю сервис из своей деятельности следующим образом.
getApplicationContext().bindService(
new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class),
serviceConnection,
Context.BIND_AUTO_CREATE
);
но проблема в активности андроида заблокирована. до обслуживания,
onServiceConnected(ComponentName className, IBinder service){ ..}
называется back.so, я искал об этом. я узнал, что мне нужно начать работу в новой теме. поэтому, пожалуйста, помогите мне в этом.
Ответы
Ответ 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 здесь.
веселит.