Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.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
Java 如何防止在活动关闭时添加片段_Java_Android_Android Fragments_Android Service_Android Handler - Fatal编程技术网

Java 如何防止在活动关闭时添加片段

Java 如何防止在活动关闭时添加片段,java,android,android-fragments,android-service,android-handler,Java,Android,Android Fragments,Android Service,Android Handler,我正在创建一个活动,它与服务通信,通过POST方法从internet下载一些数据。为此,我使用Messenger。以下是我的代码,让您更清楚: 我的onCreated()方法: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_comments); CommentsHandler

我正在创建一个
活动
,它与
服务
通信,通过
POST
方法从internet下载一些数据。为此,我使用
Messenger
。以下是我的代码,让您更清楚:

我的
onCreated()
方法:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments);

    CommentsHandler commentsHandler = new CommentsHandler(this, savedInstanceState);
    Messenger messenger = new Messenger(commentsHandler);

    Intent serviceIntent = new Intent(this, WindowService.class);
    serviceIntent.putExtra("messenger", messenger);
    serviceIntent.putExtra("state", 888);
    serviceIntent.putExtra("number", getIntent().getStringExtra("number"));
    startService(serviceIntent);
}
my
Service
线程中的代码,用于通过
Messenger
对象将结果数据发布到
活动

    /** ... **/
    Messenger messenger = intent.getParcelableExtra("messenger");
    /** ... **/
    Message resultMsg = this.obtainMessage();
    resultMsg.obj = jParser.getArrayList(); //This is an ArrayList of my downloaded data.
    messenger.send(resultMsg);
活动中的代码
用于处理来自
服务的
消息

public static class CommentsHandler extends Handler {
    Bundle mSavedInstanceState;
    ActionBarActivity activity;

    public CommentsHandler(Activity a, Bundle savedInstanceState) {
        activity = (ActionBarActivity) a;
        mSavedInstanceState = savedInstanceState;
    }

    @Override
    public void handleMessage(Message msg) {
        comments = (ArrayList<HashMap<String, String>>) msg.obj;
        if (mSavedInstanceState == null && msg.arg1 != 793) {
            activity.getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new CommentsFragment()).commit();
        } else if (msg.arg1 == 793) { //793 is my preferred code to determine
                                      //if the internet connection could not be
                                      //established when the Service was trying
                                      //to download the data.
            activity.finish();
        }
    }
}
public静态类CommentsHandler扩展处理程序{
束mSavedInstanceState;
活动性活动;
公共CommentsHandler(活动a,Bundle savedInstanceState){
活动=(ActionBarActivity)a;
mSavedInstanceState=savedInstanceState;
}
@凌驾
公共无效handleMessage(消息消息消息){
注释=(ArrayList)msg.obj;
if(mSavedInstanceState==null&&msg.arg1!=793){
activity.getSupportFragmentManager().beginTransaction()
.add(R.id.container,newcommentsFragment()).commit();
}else如果(msg.arg1==793){//793是我确定的首选代码
//如果无法连接到internet
//在服务尝试时建立
//下载数据。
activity.finish();
}
}
}

问题是:如果在下载数据之前打开
活动
并将其关闭,则此代码
.add(R.id.container,new comments fragment()).commit()
向我发出错误
在onSaveInstanceState之后无法执行此操作,因为此代码仅在我的
服务
中的数据经过处理并通过
Messenger
对象发送后执行,但此时用户已关闭
活动
,因此无法添加
片段。如何解决这个问题?如何在添加
片段之前检查
活动
是否未关闭/正在关闭?或者,更好的方法是,如何停止在
Activity
onDestroy()
方法上运行该代码的线程,以便在
Activity
关闭时不会执行该线程?提前谢谢

最小的更改是在活动中有一个布尔字段,在
onResume()
中将其设置为true,在
onPause()
中将其设置为false,并在
handleMessage()
中检查其值(即,如果标志当前为false,则忽略消息)

另一个选项是,不要使用Messenger和
handleMessage()
,而是使用
BroadcastReceiver
执行此操作。在
onResume()
中注册接收器,然后在
onPause()
中取消注册。这样,服务的广播将被忽略

无论如何,这两种解决方案基本相同,但广播有点“更高层次”


这假设如果活动暂停,您对服务的结果不感兴趣。如果您是(例如,如果您退出应用程序并返回,并且需要显示更新),那么您应该将收到的数据放在一个字段中,并在下面的
onResume()

中处理它。最小的更改是在活动中有一个布尔字段,在
onResume()中将其设置为true
和在
onPause()
中设置为false,并在
handleMessage()
中检查其值(即,如果标志当前为false,则忽略消息)

另一个选项是,不要使用Messenger和
handleMessage()
,而是使用
BroadcastReceiver
执行此操作。在
onResume()
中注册接收器,然后在
onPause()
中取消注册。这样,服务的广播将被忽略

无论如何,这两种解决方案基本相同,但广播有点“更高层次”


这假设如果活动暂停,您对服务的结果不感兴趣。如果是(例如,如果您退出应用程序并返回,并且需要显示更新),则应将收到的数据放入字段中,并在活动中的以下
onResume()

中对其进行处理,您应创建一个布尔值来检查活动是否可见:

public ActionBarActivity extends Activity {
  private boolean isActivityVisible = false;

  @Override
  protected void onResume(){
     isActivityVisible = true;
  }

  @Override
  protected void onPause(){
     isActivityVisible = false;
  }

  public boolean isVisible(){
     return this.isActivityVisible;
  }
}
然后修改处理程序类定义:

public static class CommentsHandler extends Handler {
Bundle mSavedInstanceState;
ActionBarActivity activity;

public CommentsHandler(Activity a, Bundle savedInstanceState) {
    activity = (ActionBarActivity) a;
    mSavedInstanceState = savedInstanceState;
}

@Override
public void handleMessage(Message msg) {
    // here you check if your activity is no longer visible and then break up
    if(activity == null || !activity.isVisible())
        return;

    comments = (ArrayList<HashMap<String, String>>) msg.obj;
    if (mSavedInstanceState == null && msg.arg1 != 793) {
        activity.getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new CommentsFragment()).commit();
    } else if (msg.arg1 == 793) { //793 is my preferred code to determine
                                  //if the internet connection could not be
                                  //established when the Service was trying
                                  //to download the data.
        activity.finish();
    }
}
}
public静态类CommentsHandler扩展处理程序{
束mSavedInstanceState;
活动性活动;
公共CommentsHandler(活动a,Bundle savedInstanceState){
活动=(ActionBarActivity)a;
mSavedInstanceState=savedInstanceState;
}
@凌驾
公共无效handleMessage(消息消息消息){
//在这里,您检查您的活动是否不再可见,然后中断
if(activity==null | |!activity.isVisible())
返回;
注释=(ArrayList)msg.obj;
if(mSavedInstanceState==null&&msg.arg1!=793){
activity.getSupportFragmentManager().beginTransaction()
.add(R.id.container,newcommentsFragment()).commit();
}else如果(msg.arg1==793){//793是我确定的首选代码
//如果无法连接到internet
//在服务尝试时建立
//下载数据。
activity.finish();
}
}
}

在“活动”中,您应该创建一个布尔值来检查“活动”是否可见:

public ActionBarActivity extends Activity {
  private boolean isActivityVisible = false;

  @Override
  protected void onResume(){
     isActivityVisible = true;
  }

  @Override
  protected void onPause(){
     isActivityVisible = false;
  }

  public boolean isVisible(){
     return this.isActivityVisible;
  }
}
然后修改处理程序类定义:

public static class CommentsHandler extends Handler {
Bundle mSavedInstanceState;
ActionBarActivity activity;

public CommentsHandler(Activity a, Bundle savedInstanceState) {
    activity = (ActionBarActivity) a;
    mSavedInstanceState = savedInstanceState;
}

@Override
public void handleMessage(Message msg) {
    // here you check if your activity is no longer visible and then break up
    if(activity == null || !activity.isVisible())
        return;

    comments = (ArrayList<HashMap<String, String>>) msg.obj;
    if (mSavedInstanceState == null && msg.arg1 != 793) {
        activity.getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new CommentsFragment()).commit();
    } else if (msg.arg1 == 793) { //793 is my preferred code to determine
                                  //if the internet connection could not be
                                  //established when the Service was trying
                                  //to download the data.
        activity.finish();
    }
}
}
public静态类CommentsHandler扩展处理程序{
束mSavedInstanceState;
活动性活动;
公共CommentsHandler(活动a,Bundle savedInstanceState){
活动=(ActionBarActivity)a;
mSavedInstanceState=savedInstanceState;
}
@凌驾
公共无效处理