サーバーへの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;
}
}