0

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.htmlを参照しています

スレッドの実行可能ファイルは次のようになります

Runnable mTask = new Runnable() 
{        
    public void run() 
    {  
        Log.v("service", "thread is running after 5 min");
        // Normally we would do some work here...  for our sample, we will           
        // just sleep for 30 seconds.            
        long endTime = System.currentTimeMillis() + 15*1000;            
        while (System.currentTimeMillis() < endTime) 
        {                
            synchronized (mBinder) 
            {                    
                try 
                {                        
                    mBinder.wait(endTime - System.currentTimeMillis());      
                } 
                catch (Exception e) 
                {                    

                }                
            }            
        }            // Done with our work...  stop the service!            
        AlarmService_Service.this.stopSelf();     
    }    
}

同期の概念に問題があることを認めます...スレッドはwhileループを実行して15秒間待機し、そのループ内で15秒間待機します。では、Log.v(TAG、TEXT);などのログエントリを書き込みたいだけの場合、ランナブルはどのようになりますか?自分のデータベーステーブルに新しいエントリを書き込みたい場合、何が変わりますか?

ありがとう、A。

4

2 に答える 2

0

単に交換する

{
mBinder.wait(endTime --System.currentTimeMillis());を試してください。
} catch(例外e){

}

...実行したいコードで?

Synchronizedは、一度に1つのプロセスのみがスレッドにアクセスすることを表明するだけです。

于 2011-04-05T12:57:23.417 に答える
0

ログステートメントだけが必要な場合は、以下が正常に機能します

Runnable mTask = new Runnable() 
{        
    public void run() 
    {  
        Log.v("TAG", "Some verbose log message");
    }    
}

オブジェクトで使用する必要があるかどうかsynchronizedは、オブジェクトがスレッドセーフであるかどうかによって異なります。スレッドセーフでない場合は、同期ブロックを使用して、一度に1つのスレッドのみがオブジェクトにアクセスするようにする必要があります。あなたの例mBinderではスレッドセーフではないので、バインダーのメソッドを呼び出すにwaitは、それにアクセスする唯一のスレッドであることを確認する必要があります。

Arunnableは、別のスレッドでコードを実行するために最もよく使用されるため、長時間実行される操作(IOなど、この場合は待機中)がUIスレッドをブロックすることはありません。

于 2011-04-05T15:26:21.760 に答える