2

サーバーへのtcp接続を使用して一定の間隔でファイルを常にアップロードするAndroidサービスからスレッドを開始しています。スレッドには、これを実行する while(true) ループがあります。操作はしばらく実行されますが、その後停止します。adb logcat を使用してデバッグしようとしたところ、スレッド内に出力した特定のメッセージがしばらくの間だけ表示されました。その後、彼らもやめました。さらに、サービスを停止すると、サービスの onDestroy() メソッドでスレッド オブジェクトを使用していたため、NullPointerException が発生しました。

サービスが実行されている限り、スレッドは強制終了されて実行されませんか? サービスクラス自体の onStart() でこの while(true) 操作を実行し、新しいスレッドを生成しない必要がありますか?

提供される解決策は非常に役立ちます。

コードは次のとおりです。

    public void run() 
    {           
        Log.d("TAG","Starting Thread");         
        String data = "";   
        updateServer();
        while(flag)
        {                   
            String path = extStorageDirectory + "/" + appFolder + "/" + "SAT_pingLog_" + Long.toString(System.currentTimeMillis()) + ".txt";
            createFile(path);
            int count = 0;
            while(flag && count < 32768)
            {                               
                data = "";          
                String result = Long.toString(getLatency(url));                                     
                data = Long.toString(System.currentTimeMillis()) + " " + gps[0] + " " + gps[1] + " " + strength + " " + result;
                Log.d("DEBUGGING",data);
                writeToLog(path,data);
                try 
                {
                    Thread.sleep(sleepTime);
                } 
                catch (InterruptedException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                count++;
            }
            updateServer();
        }           
    }public long getLatency(String Url)
    {
        long startTime = 0, endTime = 0, latency = 0;                   
        try 
        {
            HttpParams httpParameters = new BasicHttpParams();
            // Set the timeout in milliseconds until a connection is established.
            // The default value is zero, that means the timeout is not used. 
            int timeoutConnection = 10000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT) 
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 10000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
            HttpHead httphead = new HttpHead(Url);
            //HttpParams httpParameters = new BasicHttpParams();                
            //HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
            //HttpConnectionParams.setSoTimeout(httpParameters, 5000);
            //HttpClient httpClient = new DefaultHttpClient(httpParameters);
            //request.setURI(new URI("http://www.google.com"));
            System.out.println("Executing request " + httphead.getURI());
            Log.d("DEBUGGING","STARTING EXECUTE");
            startTime = System.currentTimeMillis();             
            HttpResponse response = httpclient.execute(httphead);
            endTime = System.currentTimeMillis();
            Log.d("DEBUGGING","ENDING EXECUTE");
            int status = response.getStatusLine().getStatusCode();
            if (status == HttpStatus.SC_OK)                                
                latency = endTime - startTime;                                      
            else
                latency = 0;
        } 
        catch(Exception e)
        {
            Log.d("DEBUGGING","EXCEPTION CAUGHT");
            e.printStackTrace();
        }   
        Log.d("DEBUGGING","LATENCY:"+Long.toString(latency));
        return latency;
    }       
}
4

1 に答える 1

3

サービスが実行されている限り、スレッドは強制終了されて実行されませんか?

Androidコンポーネントは、作成しなかったスレッドを認識しません。したがって、IntentServiceを使用するために作成されたスレッドを処理しますがonHandleIntent()、通常は、Service自分でフォークしたスレッドには注意を払いません。

サービスが破棄されると、Androidがプロセスを終了するまで、リークしたスレッドは実行され続けます。

スレッドが予期せず停止している場合、それは何の関係もありません。Service繰り返しになりますが、自分でフォークServiceしたスレッドについては何も知りません。何かが例外を発生させてループを終了させて​​いるが、何らかの理由でログに記録していないと推測されるため、空のブロックを使用して例外を黙って食べていないことを確認してください。catch

于 2012-10-20T11:36:35.280 に答える