Android线程在后台

时间:2010-02-12 11:19:58

标签: android multithreading background

我正在开发一个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()时,UI仍然被阻止。我认为这不应该发生,因为它是一个新线程。

任何人都可以帮助我吗?

由于

1 个答案:

答案 0 :(得分:2)

使用预先建立的课程为您提供更好的服务。在Android中,AsyncTask处理后台线程池和工作队列。如果您绝对觉得必须分叉自己的线程,请使用LinkedBlockingQueue而不是尝试同步对Vector的访问权限。如果您希望阅读有关该主题的更多信息,可以阅读几本关于Java并发的书籍。