2014-09-30 76 views
1

我對Android編程非常新穎,但在其他語言中有一些經驗。我想創建一個像這樣工作的APP。Android - 通過多線程執行不同的功能

enter image description here

  1. 的APP是在問我的基於Web /數據庫,服務器每10秒,如果有執行事件的過程。

  2. 的基於Web /數據庫,服務器則以事件ID甚至函數名。

  3. 的APP打開一個新的線程,其執行與ID甚至更好的直接函數名的事件。

我的問題是:

  1. 這是perfomant?或者這種衝突很容易嗎?
  2. 是不是僅限於2個線程的過程中或可我連打開每一次的,我要執行的功能一個新的線程?也許是因爲其他功能仍在運行?
  3. 如何用返回值執行函數?例如

    InputStream in = response.getEntity().getContent(); //Get the data in the entity

    public in(void) { // execute a function which got´s the same name as the variable "in" }

結果應該是:一個線程每10秒我的基於Web /數據庫,服務器,詢問是否有一個事件。事件在一個線程內執行,並行工作(同時不會崩潰或甚至陷入困境)。這些線程

示例代碼,將不勝感激。

我的代碼,直到尚未:

公共類服務延伸服務{ 私有靜態最後絃樂TAG = 「則將MyService」;

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

public void onDestroy() 
{ 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startid) 
{ 

    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

    Thread thread = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
     new Timer().scheduleAtFixedRate(new TimerTask() 
     { 
      @Override 
      public void run() 
      { 
        System.out.println("Send GO!"); 
        Device dev = new Device(); 

        dev.getDeviceId(getBaseContext()); 
        dev.getEmail(getBaseContext()); 

        dev.sendDeviceItems(); 
        } 
       }, 0, 10000);//put here time 1000 milliseconds=1 second 
      } 
      }); 

    thread.start(); 
    return Service.START_STICKY; 
    } } 
+0

輪詢(每10秒)不是一個好的解決方案,因爲您的應用程序將無法從服務器斷開連接。您應該修改您的需求,並且可能需要端口解決方案,服務器可以在您的應用處理新消息時進行ping操作。附註:我發明了這個詞的性格!我一直在使用它多年。 – danny117 2014-09-30 18:40:38

+0

也是一個不錯的解決方案。我也在考慮這個問題,但是如果手機在一定時間範圍內不能收到短信,是否有可能進入睡眠模式?如果手機是永久聽音,這是真的有效還是浪費電池? – user3325230 2014-09-30 18:49:11

回答

2
  1. 這是perfomant?或者這種衝突很容易嗎?
    • 是的,這將是性能打擊。每10秒詢問一次api會耗盡你的電池。
    • 通過適當的異常處理,它不會輕易崩潰。

是不是僅限於2個線程的過程中還是可以的我甚至每天開放的時間,我要執行的功能,一個新的線程?也許是因爲其他功能仍在運行?

  • 您可以運行你想要的線程,但是將很難在
    情況下保持代碼。你可以使用VOLLY或OKHTTP來處理網絡相關的事情,他們也會處理你的線程 。

如何用返回值執行函數?例如

InputStream in = response.getEntity()。getContent();在實體 //獲取數據

公共在(無效) { //執行哪個got's相同的名稱爲「在」 變量的函數}

  • 對於調用方法在運行時使用方法名稱,你可以在java中使用REFLECTION。這將滿足您的需求。
+0

嘿蘇海爾梅塔!非常感謝這個解釋! :)我會盡力通過你發佈的這個東西:)真的很感謝! :)其他技巧,甚至提示,當然還是讚賞! – user3325230 2014-09-30 18:36:29

+0

在這篇文章中發現了許多有用的東西,尤其是凌空。 – user3325230 2014-10-03 18:50:26

+0

謝謝,我的榮幸:) – 2014-10-04 09:18:12