0

在我的应用程序中,我有两个线程(我正在使用 AsyncTask 类)。在doInBackground()每个线程的方法中,我正在调用自己的getNewsItems(Url url)方法,该方法将连接到服务器并获得响应。之后在onPostExecute()每个线程的方法中,我将调用displayData()方法在屏幕上显示结果。

问题是当我运行时,应用程序崩溃。我认为这是因为这两个线程可以同时访问常用方法,因为当我分离常用方法时,应用程序会成功运行。我不知道是不是因为不使用序列化?

谢谢

4

2 回答 2

0

您可以将synchronized修饰符添加到由多个线程访问的方法中。

例如

public synchronized void getNewsItems(Url url){
    //some logic here
}

这样,当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

你也可以在这里阅读:http: //docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

更新:

你可以getNewsItems(Url url)像这样在一个单独的类中:

public class NewsItems{
  getNewsItems(Url url){
    //some logic here
  }
}

然后在你的线程中实例化它,如下所示:

public void run(){
  NewsItems ni = new NewsItems();
  ni.getNewsItems(url);
}

这样,将调用相同的方法,但在不同的类实例中......

于 2012-05-09T01:38:43.167 回答
0

当两个线程可以访问公共方法时没有问题。在不同的类中创建您的通用方法,然后将不同的对象共享给两个不同的线程。不要使常用方法静态同步。

于 2012-05-08T09:34:25.583 回答