我有一个使用片段进行布局的活动。当用户点击我通过互联网发送文件的按钮时,这对于Async来说太重了,它会崩溃我的应用程序,因为我需要在完成执行时关闭对话框片段。服务可以做到这一点?我需要使用该服务来处理文件,并发回消息告诉我已经完成的活动,或者如果用户的手机睡了或者他们点击了他们的主页按钮,我需要获得是否服务当我进入onResume活动时完成。这可能吗?
答案 0 :(得分:0)
创建私有类,然后在OnClick
函数中执行此操作:
new SendPictoServerextends().execute();
SendPictoServerextends:
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 " );
}
}
答案 1 :(得分:0)
服务可以解决这个问题。您需要一个活页夹或广播接收器才能与您的活动进行通信。在我看来,这可能会有点复杂,因为你需要一种方法来缓存结果,直到你的Activity从后台返回/重新创建。
您可以查看RoboSpice这是一个旨在帮助使用服务解决此问题的库。
Android服务的另一种解决方案是创建自己的经理来处理这个问题。管理器与Activity生命周期是分开的,应该是一个单例(虽然它不一定必须是),它可以在后台线程中处理并存储结果。在您的片段中,onResume
向您的经理注册为监听器,以便在操作完成时接收结果。 Fragment在onPause
中未注册,以避免上下文泄漏。因为管理器存储结果,所以它可以保留结果,直到Fragment恢复然后交付它。
滚动你自己的“经理”类型课程对你来说将是一些额外的努力,但如果你不想因为某种原因大量使用第三方库,这可能是值得的。