2013-12-10 19 views
0

我在IntentService中執行一些操作(上傳圖片到webservice)。 請參閱下面的代碼。如何在android中執行後臺進程?

在這個活動中,我打電話給這樣的服務。 我在捕獲圖像後,即在onActivityResult中調用下面的方法。當我在onActivityResult中調用此方法時,該應用程序正在被吊死。我能夠在IntentService中執行任務。但是這種行爲正在被絞死。

private void callService(){ 
    Intent intent = new Intent(this, TestIntentService.class); 
    intent.putExtra("imageData", imageData); 
    startService(intent); 
} 

這是我的IntentService類。 我可以在callImageUploadAPI()內執行webservice調用嗎。 我在這裏做錯了什麼?

public class TestIntentService extends IntentService { 

    public TestIntentService() { 
     super("com.screens.testapp"); 
     // TODO Auto-generated constructor stub 
    } 
//imageData passed from the activity 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     // TODO Auto-generated method stub 
    if(intent != null){ 
     Bundle extras = intent.getExtras(); 
     imageData= extras.getString("imageData"); 
    } 
     callImageUploadAPI(imageData); 
    } 

    private void callImageUploadAPI(final String imageData) { 

     // TODO Auto-generated method stub 
     try { 
      if (Log.checkNetworkStatus(TestIntentService.this)) { 

      } else { 

      } 
     } catch (Exception e) { 
      // TODO: handle exception 

     } 
    } 

} 

感謝

+1

您正在使用INTENTSERVICE來啓動您的服務來訪問Web服務,它會自動作爲後臺進程運行。或者,如果您想要在新線程中使用AsyncTask服務,請在doInBackground中進行Web服務callig (參數)和結果將在onPostExecute(結果)....快樂編碼。 – Joyal

回答

0

爲您在後臺執行使用服務的行爲。

您可以從您的活動啓動服務,並且可以爲該服務分配一個線程,併爲該線程與UIThread之間的通信分配一個處理程序。

檢查:http://developer.android.com/guide/components/services.html

小先睹爲快

服務是一個可以在後臺執行長時間運行的操作,並且不提供用戶界面的應用組件。

+0

我爲此使用了IntentService。請在帖子中查看我的代碼。代碼是否正確? – ravi

+0

我還沒有嘗試過,但它似乎是正確的,雖然你沒有在callImageUploadApi中做任何事情在那裏添加一些打印,所以你可以看到,如果方法實際上是beeing調用,並且該字符串是你期望它是,而不是空或其他東西。 – JoaoFilipeClementeMartins

+0

我正在調用callImageUploadApi中的webservice。我無法分享那個代碼,這就是爲什麼我提到了callImageUploadApi中的代碼。 – ravi

2

如果你需要做一個任務的背景下,Android提供了一個名爲AsyncTask類,你可以擴展,並用它做一個網絡操作或其他任何繁重的操作。這是Android Developer Website (AsyncTask Page):

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

一個例子,這可能在你的代碼這種方式使用:

if (Log.checkNetworkStatus(TestIntentService.this)) { 
       new DownloadFilesTask().execute(url1, url2, url3); 
      } else { 

      } 
+0

感謝您給予回覆。但我想在後臺執行此任務。用戶可以在前臺執行其他任務。 – ravi

+0

@ravi AsyncTask類的'doInBackground'方法爲您提供了這個工具。您可以在此方法的主體中執行您想要在後臺執行的任何任務。 –

+0

當任務在後臺運行時,我無法使用「進度」對話框。當任務在後臺運行時,用戶必須執行操作(按鈕點擊或輸入一些數據)。 – ravi