0

私のアプリケーションには2つのスレッドがあります(AsyncTaskクラスを使用しています)。doInBackground()自分のメソッドを呼び出している各スレッドのメソッドgetNewsItems(Url url)で、このメソッドはサーバーに接続して応答を取得します。その後、onPostExecute()各スレッドのメソッドで、メソッドを呼び出しdisplayData()て結果を画面に表示します。

問題は、実行するとアプリケーションがクラッシュすることです。これは、これら2つのスレッドが同時に共通のメソッドにアクセスできるためだと思います。これは、共通のメソッドを分離すると、アプリが正常に実行されるためです。シリアル化を使わないからなのかわかりませんか?

ありがとう

4

2 に答える 2

0

2つのスレッドが共通のメソッドにアクセスできる場合、問題はありません。異なるクラスで共通のメソッドを作成してから、異なるオブジェクトを2つの異なるスレッドで共有します。一般的な方法を静的同期にしないでください。

于 2012-05-08T09:34:25.583 に答える
0

synchronized複数のスレッドからアクセスされるメソッドに修飾子を付けることができます。

例えば

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

そのため、1つのスレッドがオブジェクトの同期メソッドを実行しているときに、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッドは、最初のスレッドがオブジェクトで実行されるまで実行を一時停止します。

こちらでも読むことができます: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 に答える