Android:从服务中的onPostexecute AsyncTask获取结果

时间:2014-04-22 10:45:27

标签: android android-asynctask

我正在使用AsyncTask来下载文件。在服务中使用asynkTask。我希望在下载之后,该服务可以使用asynkTask的onPostexecute返回的数据执行操作。我可以从日志中查看数据,在onPostexecute,但我不能,在服务中得到它。我看到了很多回复,但这对我没有用,我希望有人会给我一个解决方案。谢谢你。

我从主要活动开始提供服务。

**编辑3 **没有例外,我将上下文添加到新的DownloadFileFromURL(this).execute(file_url);

此代码现在正在运行。

编辑后,我有一个execption。 这是我正在使用的代码: 这项服务:

 public class DownloadService extends Service  implements OnTaskCompleted {
        // File url to to download     
        private  String file_url = "http://192.168.1.150:8080/TestAndroid/DownloadServlet/Desert.jpg";
        public int onStartCommand(Intent intent, int flags, int startId) {
            int rssi1 = intent.getIntExtra("key1", 0);
            new DownloadFileFromURL(this).execute(file_url);
            return START_STICKY; }

                    //EDIT
                    DownloadFileFromURL  task = new DownloadFileFromURL(this);
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
@Override
        public void onTaskCompleted(String result){
            //your stuff on complete of task
            Toast.makeText(getBaseContext(), "Service receiving from post"+result, Toast.LENGTH_LONG).show();
        }
    }

这是我的DownloadFileFromURL类

 class DownloadFileFromURL extends AsyncTask<String, String, String> {
//Edit
private OnTaskCompleted listener;

    public DownloadFileFromURL (OnTaskCompleted listener){
        this.listener=listener;
    }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
               }

        /**
         * Downloading file in background thread
         * */
        protected String doInBackground(String... f_url) {
            int count;
            try { //Download  }



                catch (Exception e) {             }
               return reslut;
            }

            protected void onProgressUpdate(String... progress) {
           }

            /**
             * After completing background task
             * 
             * **/


  @Override
         protected void onPostExecute(String reslut) {
listener.onTaskCompleted(reslut);
            Log.i("reslut","**************"+reslut);//i want to send this data to the service

               }

        }

界面:

public interface OnTaskCompleted{
void onTaskCompleted(String values);

}

3 个答案:

答案 0 :(得分:1)

您可以创建一个接口作为监听器,它将监听任务的完成情况,一旦完成,它将在您的服务中调用call方法

答案 1 :(得分:1)

为了更容易使用AsyncTasks,我直接在我的服务中覆盖方法:

new DownloadFileFromURL() {
    @Override
    protected Object doInBackground(Object... params) {
        // Download 
        return result;
    }
    @Override
    protected void onPostExecute(Object result) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // treat result (ui thread will be your service)
            }
        });
    }
}.execute(file_url);

答案 2 :(得分:1)

!。创建一个界面

public interface OnTaskCompleted{
    void onTaskCompleted(boolean isSuccess);
}

2.在您的服务中实现OnTaskCompleted

public class DownloadService extends Service implements  OnTaskCompleted  {
    // File url to to download     
    private  String file_url = "http://192.168.1.150:8080/TestAndroid/DownloadServlet/Desert.jpg";
    public int onStartCommand(Intent intent, int flags, int startId) {
        int rssi1 = intent.getIntExtra("key1", 0);
        new DownloadFileFromURL().execute(file_url);
        return START_STICKY;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;

    void onTaskCompleted(boolean isSuccess){
        //your stuff on complete of task
    }
    }

3。在postExecute上你必须设置监听器为真

protected void onPostExecute(String reslut) {
        listener.onTaskCompleted(values);
           }

这就是你必须要做的事情,它可能无法正常工作,你必须做必要的改变