我有一个向url发送错误的服务,这个服务在其他服务中很好,但当我在self中出现错误时,会陷入非常糟糕的循环。
public class Error_Service extends Service {
Context context;
RequestPackage RP;
String Value;
G g;
Internet_Connect IC;
public final static String MY_ACTION_E = "MY_ACTION_E";
@Override
public void onCreate() {
context = this;
IC = new Internet_Connect(context);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleStart(intent, startId);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
void handleStart(Intent intent, int startId) {
String ww = null;
try {
Log.i("ASDASASDAS",ww);
}catch (Exception e){
g = new G();
new GetErrors(context);
Exception_String EX =new Exception_String();
GetErrors.SendErrors("43", EX.ValueEX(e), g.VersionCode());
return;
}
RP = (RequestPackage) intent.getSerializableExtra("MyValue");
try {
Value = new ErrorService().execute(RP).get();
} catch (InterruptedException e) {
e.printStackTrace();
if (IC.getConnectivityStatus()) {
g = new G();
new GetErrors(context);
Exception_String EX = new Exception_String();
GetErrors.SendErrors("43", EX.ValueEX(e), g.VersionCode());
}
} catch (ExecutionException e) {
e.printStackTrace();
if (IC.getConnectivityStatus()) {
g = new G();
new GetErrors(context);
Exception_String EX = new Exception_String();
GetErrors.SendErrors("43", EX.ValueEX(e), g.VersionCode());
}
} finally {
ThreadFinish_Send thread_finish = new ThreadFinish_Send();
thread_finish.start();
}
}
public class ErrorService extends AsyncTask<RequestPackage,String,String>{
@Override
protected String doInBackground(RequestPackage... params) {
BufferedReader reader = null;
String uri = params[0].getUri();
if (params[0].getMethod().equals("GET")) {
uri += "?" + params[0].getEncodedParams();
}
try {
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(params[0].getMethod());
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line + "n");
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
if (IC.getConnectivityStatus()) {
g = new G();
new GetErrors(context);
Exception_String EX = new Exception_String();
GetErrors.SendErrors("43", EX.ValueEX(e), g.VersionCode());
return null;
}
return null;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
if (IC.getConnectivityStatus()) {
g = new G();
new GetErrors(context);
Exception_String EX = new Exception_String();
GetErrors.SendErrors("43", EX.ValueEX(e), g.VersionCode());
return null;
}
return null;
}
}
}
}
}
public class ThreadFinish_Send extends Thread{
@Override
public void run() {
Intent intent = new Intent();
intent.setAction(MY_ACTION_E);
intent.putExtra("MVE",Value);
sendBroadcast(intent);
stopSelf();
}
}
}
我能做什么?
我认为你应该重写这个,太可怕了。
*您的命名令人困惑(Error_Service和ErrorService,真的吗?)
*你使用了无法识别的变量名(G到底是什么)
*在主线程上使用AsyncTask.execute.get()。你几乎不应该使用。get——如果你认为你需要,你可能错了。如果你在主线上,你总是错的。
*你有一个finally,它启动了一个新的线程,只是为了激发一个意图。为什么?实际上没有任何可能的理由在那里使用线程。
*您在十几个地方粘贴了相同的错误处理代码副本。
这段代码实际上是我很长一段时间以来看到的最糟糕的代码之一。把它扔掉,重新开始。
无论你在做什么,错误处理代码都是你的直接问题。这是错误日志记录服务。如果它不能记录另一个错误,为什么它能够记录自己的错误?当它失败时,它需要无声地失败。