2014-06-07 66 views
0

我想保持AsyncTask全天候運行。它從互聯網下載一些信息,然後將其發送給相關人員。發送短信後,如果有新的信息可用,請再次檢查。我的手機有足夠的內存可用來運行我的應用程序。我發現在3-5小時內停止應用程序。經過漫長的觀察,我發現如果有任何其他應用程序,例如WhatsApp收到或發送任何消息,則我的應用程序停止工作。但這並非每次都發生。當任何其他應用與互聯網通信時,我的應用停止非常罕見。有時候我認爲我沒有正確地判斷爲什麼應用程序停止。它停止時不會產生任何錯誤。看起來,應用程序簡單地完成了自己的任務並自行關閉。這是我的代碼,我是如何做到這一點的。請幫我弄清楚這個問題。如果任何其他應用程序與互聯網通信,則應用程序停止工作

Timer SMSTimer; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    SMSTimer = new Timer(); 
    new Timer().scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
       if (runNewTask){ 
        new RequestTask().execute(BaseUrl); 
        runNewTask =false; 
       } 
       } 
      }); 
     } 
    }, 0, 5000); 

} 

public class RequestTask extends AsyncTask<String, String, String>{ 
    @Override 
    protected String doInBackground(String... url) { 

     try {  
      // constants 
      int timeoutSocket = 30000; 
      int timeoutConnection = 30000; 
      HttpParams httpParameters = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
      HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
      HttpClient client = new DefaultHttpClient(httpParameters); 
      HttpGet httpget = new HttpGet(url[0]); 
      HttpResponse getResponse = client.execute(httpget); 
      getResponse.addHeader("Cache-Control:", "no-cache"); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 
      if(statusCode != HttpStatus.SC_OK) { 
       Log.w("MyApp", "Download Error: " + statusCode + "| for URL: " + url); 
       return null; 
      } 
      String line = ""; 
      StringBuilder total = new StringBuilder(); 
      HttpEntity getResponseEntity = getResponse.getEntity(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(getResponseEntity.getContent())); 

      while((line = reader.readLine()) != null) { 
       total.append(line); 
       total.append("\n"); 
      } 
      line = total.toString(); 
      return line; 
     } catch (Exception e) { 
      return null; 

     } 
     return null; 
    } 
    @Override 
    protected void onPreExecute() { 

    } 
    @Override 
    protected void onPostExecute(String result) { 

     try { 
      if(result != null) { 
       CreatMsg(result); 

      } 
       runNewTask = true; 
     } catch(NullPointerException e) { 
      runNewTask = true; 
     } 

    } 
} 
+2

?當然你應該使用服務?也是一個啓動器以及重新啓動後重新啓動你的任務? – jamesc

+1

從AsyncTask文檔:AsyncTasks理想情況下應該用於短操作(最多幾秒鐘)。如果您需要保持線程長時間運行,強烈建議您使用java提供的各種API。 util.concurrent pacakge,如Executor,ThreadPoolExecutor和FutureTask。 – todd

+0

我不知道你剛剛說的話。如果您請提供我鏈接到任何教程? – user934820

回答

0

我現在使用Alarm Manager來重複這個任務,它像一個魅力一樣工作。

private PendingIntent pendingIntent; 
private AlarmManager manager; 

    private void setRecurringAlarm(Context context) { 


     manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     int interval = 10000; 
     manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 
     // Toast.makeText(this, "Set", Toast.LENGTH_SHORT).show(); 

} 

這裏是接收器

public class AlarmReceiver extends BroadcastReceiver { 


     public void onReceive(Context context, Intent intent) { 
      // start the download 

       if (MainActivity.runNewTask){ 
        MainActivity.runNewTask = false; 
        MainActivity.StartServer(); 

       } 

     } 
    } 
你爲什麼要使用AsynchTask
相關問題