Android - 服务陷入困境?

时间:2016-04-29 16:00:54

标签: android android-service android-looper

我有一个将错误发送到网址的服务,这项服务在其他服务中很好用,但是当我在自我中出错时会陷入非常糟糕的循环中。

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();
        }
    }
}

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我认为你应该改写这个,太可怕了。

*您的命名令人困惑(Error_Service和ErrorService,真的吗?)

*您使用无法识别的变量名称(G g是多少)

*您在主线程上使用AsyncTask.execute.get()。你几乎不应该使用.get-如果你认为你需要你可能是错的。如果你在主线上,你总是错的。

*你有一个终结,它只是为了触发一个意图而开始一个新线程。为什么?实际上没有理由在那里使用线程。

*您在十几个地方粘贴了相同的错误处理代码副本。

这段代码实际上是我在很长一段时间内见过的最糟糕的代码。垃圾并重新开始。

除非您正在使用它 - 错误处理代码是您的直接问题。这是错误记录服务。如果它无法记录另一个错误,为什么它能够自己记录?当它失败时,它需要默默地失败。