2013-12-10 22 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