2017-08-11 244 views
-1

我是一名初學者程序員,製作了一個簡單的應用程序,它向api發送一個HTTP請求並獲取一些信息。我希望應用程序繼續這樣做,並在每個小時自動更新一次。我已經成功地使用HttpURLConnection,一個擴展AsyncTaskLoader的Loader,以及一個Handler和Runnable,可以在固定的時間重新啓動加載器。如何在Android應用程序的後臺進行網絡請求?

當應用程序處於前臺時,此功能正常工作,但只要切換到其他應用程序或關閉屏幕,它就會停止工作。我嘗試使用部分喚醒鎖來保持應用程序正常運行,但儘管應用程序正在運行,但一旦它停止在前臺,所有網絡活動都會停止,並且我得到一個不活動的InputConnection

警告消息。有什麼我可以做的,以保持這個連接活動時,應用程序在後臺?

回答

0

嘗試使用服務。

服務

public class TimeService extends Service { 
     // constant 
     public static final long NOTIFY_INTERVAL = 10 * 1000; // 10 seconds 

     // run on another Thread to avoid crash 
     private Handler mHandler = new Handler(); 
     // timer handling 
     private Timer mTimer = null; 

     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 

     @Override 
     public void onCreate() { 
      // cancel if already existed 
      if(mTimer != null) { 
       mTimer.cancel(); 
      } else { 
       // recreate new 
       mTimer = new Timer(); 
      } 
      // schedule task 
      mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL); 
     } 

     class TimeDisplayTimerTask extends TimerTask { 

      @Override 
      public void run() { 
       // run on another thread 
       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         // display toast 
         Toast.makeText(getApplicationContext(), getDateTime(), 
           Toast.LENGTH_SHORT).show(); 
        } 

       }); 
      } 

      private String getDateTime() { 
       // get date time in custom format 
       SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]"); 
       return sdf.format(new Date()); 
      } 

     } 

艙單

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".TimeService"/> 
    </application> 

Main類

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

     startService(new Intent(this, TimeService.class)); 
    } 

Source

相關問題