Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 恢复活动时获取服务的结果_Android_Android Asynctask_Android Service_Android Dialogfragment - Fatal编程技术网

Android 恢复活动时获取服务的结果

Android 恢复活动时获取服务的结果,android,android-asynctask,android-service,android-dialogfragment,Android,Android Asynctask,Android Service,Android Dialogfragment,我有一个活动正在使用片段进行布局。当用户单击“我正在通过internet发送文件”按钮时,这对Async来说太重了,它会使我的应用程序崩溃,因为我需要在对话框执行完毕后关闭它。服务能做到这一点吗?我需要使用该服务来处理文件,并发送一条消息告诉我的活动已经完成,或者如果用户的手机睡着了,或者他们按了他们的主页按钮,我需要在进入“活动恢复”时了解服务是否完成。这可能吗?创建一个私有类,然后在OnClick函数中执行以下操作: new SendPictoServerextends().execute(

我有一个活动正在使用片段进行布局。当用户单击“我正在通过internet发送文件”按钮时,这对Async来说太重了,它会使我的应用程序崩溃,因为我需要在对话框执行完毕后关闭它。服务能做到这一点吗?我需要使用该服务来处理文件,并发送一条消息告诉我的活动已经完成,或者如果用户的手机睡着了,或者他们按了他们的主页按钮,我需要在进入“活动恢复”时了解服务是否完成。这可能吗?

创建一个私有类,然后在
OnClick
函数中执行以下操作:

new SendPictoServerextends().execute();
SendPictoServer扩展:

private class SendPictoServerextends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
                        //code to send data to the server

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e);
        }



        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
        System.out.println("Mission is done "  );

    }

}
私有类SendPictoServer扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=newprogressdialog(getActivity());
setMessage(“请稍候…”);
pDialog.setCancelable(假);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
试一试{
//将数据发送到服务器的代码
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
系统输出打印ln(e);
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
//关闭进度对话框
if(pDialog.isShowing())
pDialog.disclose();
System.out.println(“任务完成”);
}
}

服务部门可以处理这一问题,这是正确的。您需要一个活页夹或广播接收器来与您的活动进行通信。在我看来,这可能有点复杂,因为您需要一种方法来缓存结果,直到您的活动从后台返回/重新创建

您可以查看哪一个库是专为使用服务帮助解决此问题而设计的

Android服务的另一个解决方案是创建自己的管理器来处理这个问题。管理器与活动生命周期是分开的,可能应该是一个单例(尽管它不一定必须是单例),它可以在后台线程中处理并存储结果。在您的片段中,
onResume
作为侦听器向您的经理注册,以便在操作完成时接收结果。在
onPause
中注销片段以避免上下文泄漏。因为管理器存储结果,所以它可以保留结果,直到片段恢复,然后交付它


滚动您自己的“Manager”类型的类对您来说是额外的努力,但如果您不想出于任何原因广泛使用第三方库,那么这可能是值得的。

不幸的是,这对我不起作用,因为它与我现在所做的类似。无法保证当我进入onPostExecute时,该活动将处于活动状态,因此当用户执行诸如点击“主页”或让手机进入睡眠等操作时,会抛出非法SateException(正如我在测试此应用程序时多次看到的那样)。我绝对需要对话框来显示每次异步完成的时间。ProgressDialog会将我的活动发送到后台并调用它的onPause,导致上述异常;用户在发送进度对话框的数据时,即使“后退”按钮不起作用,也无法执行任何操作?如果它是可取消的,则可以从中取出。这仍然不能解决用户点击主页按钮的问题。但即便如此,进度对话框本身也会将活动置于后台,因此不能保证在点击onPostExecute后会调用onSaveInstance。当这种情况发生时,我提到的异常将被抛出;现在我明白你想说什么了。。。选中此项@emdal这是一个很好的起点,但请注意链接中的代码将服务绑定到活动。因此,如果活动被破坏,服务将停止。这不是OP想要的。您可以使用广播接收器,在获得数据后将数据投入服务并发送广播。在activity register broadcast的
onResume
onPause
方法中取消注册,如果在我的活动暂停时我的服务中的处理结束,会发生什么情况?当我的活动调用onResume并注册广播时,是否会有某种队列,我可以从中获得结果?我只需要知道数据是发送的,这样我就可以关闭片段对话框。是否有一种方法可以让服务运行,即使活动暂停,然后让我的活动查看服务,看看在我调用onResume时它是否完成,或者它是否比这更复杂?我相信它比这更复杂一些。该服务实际上只应运行到其任务完成为止。但是,您可以创建长时间运行的服务,您只需注意服务生命周期以及活动生命周期。为了保证服务持续运行,您可以使用
前台服务
,但这需要您在状态栏中放置一个通知,而这可能不是您想要的。