Android нить в фоновом режиме - PullRequest
1 голос
/ 12 февраля 2010

Я занимаюсь разработкой приложения для Android, и у меня возникла проблема с запуском нового потока в фоновом режиме.

Я делаю класс с этим кодом:

public class Downloader implements Runnable {

private Vector <DownloadRequest>messages = new Vector<DownloadRequest>(); 
static final int MAXQUEUE = 5; 
ApiRequest mApi;


public void run() { 
    try { 
        while ( true ) { 
            getMessage(); 
        } 
    }  
    catch( ErrorException e ) { } 
} 
private synchronized void getMessage() throws ErrorException{ 
    try {
        notify(); 
        Log.d("DOWNLOADER", "empiezo a coger los mensajes");
        while ( messages.size() == 0 ) 
            wait(); 
        DownloadRequest dr = messages.firstElement(); 
        mApi.setMethod(dr.getRequest());
        try {
            mApi.executeRequest();
        } catch (ErrorException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Object o = dr.getObject();
        o.notify();
        return;
    }catch(InterruptedException e) {
        throw new ErrorException();

    }

Цель - дождаться получения нового сообщения и вызвать API.

Этот объект запущен в новом потоке в этом задании

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);
    mDownloader = new Downloader(new ApiRequest());
    Thread thread = new Thread(mDownloader);
    thread.start();
    DownloadRequest dr = new DownloadRequest(this,TRIPS_METHOD);
    try {
        mDownloader.putMessage(dr);

Но когда вызывается thread.start(), пользовательский интерфейс остается заблокированным. Я думаю, что это не должно произойти, потому что это новая тема.

Кто-нибудь может мне помочь?

Спасибо

1 Ответ

2 голосов
/ 12 февраля 2010

Вы намного лучше обслужены, используя заранее установленные классы для этого. В Android AsyncTask обрабатывает как фоновый пул потоков, так и рабочую очередь. Если вы абсолютно уверены, что вам необходимо создать собственный поток, используйте LinkedBlockingQueue вместо попытки синхронизации доступа к Vector. Есть несколько книг по параллелизму Java, если вы хотите прочитать больше по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...