2015-11-10 40 views
2

有没有什么办法可以在Activity onDestroy事件上ping一个url。我曾尝试使用AsyncTask,因为一些教程表示它将在onDestroy之后执行,但它不起作用。Android需要ping url onDestroy事件

这是在课堂上,我平毁

public class inactive extends AsyncTask<String, Integer, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     String res = new String(); 
     try { 
      BufferedReader reader = null; 
      URLConnection uc = null; 
      try { 
       URL urll = new URL(new StringBuilder() 
         .append("www.myuru.com").toString()); 
       uc = urll.openConnection(); 
       uc.connect(); 
       reader = new BufferedReader(new InputStreamReader(uc.getInputStream())); 
       StringBuffer buffer = new StringBuffer(); 
       int read; 
       char[] chars = new char[1024]; 
       while ((read = reader.read(chars)) != -1) 
        buffer.append(chars, 0, read); 
       res = buffer.toString(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       if (reader != null) { 
        reader.close(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return res; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 
} 

,这是从我的活动中的onDestroy方法

@Override 
protected void onDestroy() { 
    new inactive(this, sharedpreferences).execute(); 
    super.onDestroy(); 

} 

我的测试表明,这种代码中断时它试图打开连接(urll.openConnection())。

我已经试过线程,异步任务和syncronously调用带有多种方法,如网址:URLConnection的,HTTPGET

+1

请发布您用于ping网址的代码。 –

回答

0

这是困难的,因为你必须运行在网络请求背景(异步)。

因此,即使您计划网络请求发生在后台,它可能会失败,因为您然后会销毁发送它的活动。

另一种方法可能是保存要发送到文件的消息(同步),然后在用户再次启动应用程序时再触发。


一个更复杂的方法可能是开始Service(生活中可以没有一个活动存在于前台),并让该处理任何网络请求。

作为一个说明,我会避免通过服务做大量工作,因为那样用户会注意到性能下降。

+0

谢谢!我已将我的网址ping代码移至服务中,现在它完美无缺。 –

0

简单的方法:

@Override 
onDestroy(){ 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      ping();//your ping code here! 

     } 
    }).start(); 
    super.onDestroy(); 

} 
+0

我已经尝试过这样的内部线程,它没有工作。 HttpURLConnection urlc =(HttpURLConnection)url.openConnection(); urlc.setConnectTimeout(1000 * 30); urlc.connect(); –

+0

你是什么意思的“没有工作”?你想把它写入一个文件吗?如果是的话,那么我认为你应该检查你的代码读取和写入url,而不是检查'AsyncTask'或'Thread'。此外,你没有写任何与sharedPreferences有关的东西。 –

+0

我知道如何ping一个url。问题是,当我尝试这样做时,应用程序被破坏。你能发表一个实例吗? –