我有一个将错误发送到网址的服务,这项服务在其他服务中很好用,但是当我在自我中出错时会陷入非常糟糕的循环中。
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();
}
}
}
我该怎么办?
答案 0 :(得分:0)
我认为你应该改写这个,太可怕了。
*您的命名令人困惑(Error_Service和ErrorService,真的吗?)
*您使用无法识别的变量名称(G g是多少)
*您在主线程上使用AsyncTask.execute.get()。你几乎不应该使用.get-如果你认为你需要你可能是错的。如果你在主线上,你总是错的。
*你有一个终结,它只是为了触发一个意图而开始一个新线程。为什么?实际上没有理由在那里使用线程。
*您在十几个地方粘贴了相同的错误处理代码副本。
这段代码实际上是我在很长一段时间内见过的最糟糕的代码。垃圾并重新开始。
除非您正在使用它 - 错误处理代码是您的直接问题。这是错误记录服务。如果它无法记录另一个错误,为什么它能够自己记录?当它失败时,它需要默默地失败。