我正在开发一个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仍然被阻止。我认为这不应该发生,因为它是一个新线程。
任何人都可以帮助我吗?
由于
答案 0 :(得分:2)
使用预先建立的课程为您提供更好的服务。在Android中,AsyncTask
处理后台线程池和工作队列。如果您绝对觉得必须分叉自己的线程,请使用LinkedBlockingQueue
而不是尝试同步对Vector
的访问权限。如果您希望阅读有关该主题的更多信息,可以阅读几本关于Java并发的书籍。