Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 onResume在从其他活动返回时表现不符合预期_Java_Android_Oncreate_Onresume - Fatal编程技术网

Java onResume在从其他活动返回时表现不符合预期

Java onResume在从其他活动返回时表现不符合预期,java,android,oncreate,onresume,Java,Android,Oncreate,Onresume,我有一个小应用程序,可以计算到指定日期和时间的时间。它工作得很好 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; import android.app.Activity; import android.content.Intent; import android.content.SharedPref

我有一个小应用程序,可以计算到指定日期和时间的时间。它工作得很好

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.widget.DigitalClock;
import android.widget.TextView;

public class Day2GoActivity extends Activity {
private TextView tvWeeks, tvDays, tvHours, tvMinutes, tvSeconds, timeUntil;


public Date curDateTime = new Date();
public Calendar today = Calendar.getInstance();
public Calendar leaving = Calendar.getInstance();
protected SimpleDateFormat sdf = new SimpleDateFormat("E dd-MMM-yyyy HH:mm");

protected Handler h = new Handler();
protected Runnable r = new Runnable() {
    public void run() {
        afficher();
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tvDays = (TextView) findViewById(R.id.tvDays);
    timeUntil = (TextView) findViewById(R.id.timeUntil);
    tvWeeks = (TextView) findViewById(R.id.tvWeeks);
    tvHours = (TextView) findViewById(R.id.tvHours);
    tvMinutes = (TextView) findViewById(R.id.tvMinutes);
    tvSeconds = (TextView) findViewById(R.id.tvSeconds);
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("TAG", "Resuming");
    SharedPreferences sharedPreferences = getSharedPreferences("preferences", MODE_PRIVATE);
    Log.i("MyActvity", "Year = " + sharedPreferences.getInt("year", Calendar.YEAR));

    leaving.set(sharedPreferences.getInt("year", Calendar.YEAR), sharedPreferences.getInt("month", Calendar.MONTH),
            sharedPreferences.getInt("dayOfMonth", Calendar.DAY_OF_MONTH), sharedPreferences.getInt("hour", Calendar.HOUR_OF_DAY),
            sharedPreferences.getInt("minute", Calendar.MINUTE));
    timeUntil.setText("Time until: " + sdf.format(leaving.getTime()));
    r.run();
    Log.w("TAG", "Resumed");

}

private void afficher() {
    today = Calendar.getInstance();
    long millisToGo = leaving.getTimeInMillis() - today.getTimeInMillis();
    long seconds2go = TimeUnit.MILLISECONDS.toSeconds(millisToGo);
    tvSeconds.setText(String.format("%,d seconds", seconds2go));
    long minutes2go = TimeUnit.MILLISECONDS.toMinutes(millisToGo);
    tvMinutes.setText(String.format("%,d minutes", minutes2go));
    long hours2go = TimeUnit.MILLISECONDS.toHours(millisToGo);
    tvHours.setText(String.format("%d hours", hours2go));
    tvDays.setText(String.format("%d days %d hours", (int) hours2go / 24, hours2go % 24));
    long days2go = TimeUnit.MILLISECONDS.toDays(millisToGo);
    tvWeeks.setText(String.format("%d weeks %d days", (int) days2go / 7, days2go % 7));
    h.postDelayed(r, 1000);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    Intent myIntent = new Intent(getApplicationContext(), editDate.class);
    startActivity(myIntent);
    return true;
}
但是,当用户更改日期和时间时,我有一个问题。我还有第二个
活动
,如您所见,它在
oncreateoptions菜单中被调用。它也很好用

import java.util.Calendar;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.TimePicker;

public class editDate extends Activity {

protected DatePicker dp1;
protected TimePicker tp1;
protected Calendar c;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.edit);
    dp1 = (DatePicker) findViewById(R.id.datePicker1);
    tp1 = (TimePicker) findViewById(R.id.timePicker1);
    tp1.setIs24HourView(true);
    LoadPreferences();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    SavePreferences();
}

private void SavePreferences() {
    SharedPreferences sharedPreferences = this.getSharedPreferences("preferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    editor.putInt("year", dp1.getYear());
    editor.putInt("month", dp1.getMonth());
    editor.putInt("dayOfMonth", dp1.getDayOfMonth());
    editor.putInt("hour", tp1.getCurrentHour());
    editor.putInt("minute", tp1.getCurrentMinute());
    editor.commit();
}

private void LoadPreferences() {
    SharedPreferences sharedPreferences = this.getSharedPreferences("preferences", MODE_PRIVATE);
    c = Calendar.getInstance();

    try {
        dp1.init(sharedPreferences.getInt("year", c.YEAR), sharedPreferences.getInt("month", c.MONTH),
                sharedPreferences.getInt("dayOfMonth", c.DAY_OF_MONTH), null);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        dp1.init(2012, 5, 1, null);
    }
    tp1.setCurrentHour(sharedPreferences.getInt("hour", c.HOUR_OF_DAY));
    tp1.setCurrentMinute(sharedPreferences.getInt("minute", c.MINUTE));
}

}
应用程序运行正常,日志cat文件中包含所有预期条目:

06-01 18:21:04.049: I/ApplicationPackageManager(7750): cscCountry is not German : XEU
06-01 18:21:04.079: I/TAG(7750): Resuming
06-01 18:21:04.089: I/MyActvity(7750): Year = 2014
06-01 18:21:04.089: W/TAG(7750): Resumed
06-01 18:21:05.459: W/KeyCharacterMap(7750): No keyboard for id 0
06-01 18:21:05.459: W/KeyCharacterMap(7750): Using default keymap:    /system/usr/keychars/qwerty.kcm.bin
06-01 18:21:05.519: I/ApplicationPackageManager(7750): cscCountry is not German : XEU
06-01 18:21:05.619: W/Picker(7750): beforeTextChanged: 01, 0, 2, 2
06-01 18:21:05.619: W/Picker(7750): onTextChanged: 01
06-01 18:21:05.619: W/Picker(7750): onTextChanged: 01, 0, 2, 2
06-01 18:21:05.619: W/Picker(7750): aftertextchanged: 01
06-01 18:21:05.619: W/Picker(7750): beforeTextChanged: 01, 0, 2, 2
06-01 18:21:05.619: W/Picker(7750): onTextChanged: 01
06-01 18:21:05.619: W/Picker(7750): onTextChanged: 10, 0, 2, 2
06-01 18:21:05.619: W/Picker(7750): aftertextchanged: 10
06-01 18:21:05.619: W/Picker(7750): beforeTextChanged: 2012, 0, 4, 4
06-01 18:21:05.619: W/Picker(7750): onTextChanged: 2012
06-01 18:21:05.619: W/Picker(7750): onTextChanged: 2014, 0, 4, 4
06-01 18:21:05.619: W/Picker(7750): aftertextchanged: 2014
06-01 18:21:08.239: E/DatePicker(7750): adjustMaxDat : 31 10
06-01 18:21:08.239: W/Picker(7750): beforeTextChanged: 10, 0, 2, 2
06-01 18:21:08.249: W/Picker(7750): onTextChanged: 10
06-01 18:21:08.249: W/Picker(7750): onTextChanged: 01, 0, 2, 2
06-01 18:21:08.249: W/Picker(7750): aftertextchanged: 01
06-01 18:21:08.259: W/Picker(7750): beforeTextChanged: 01, 0, 2, 2
06-01 18:21:08.259: W/Picker(7750): onTextChanged: 01
06-01 18:21:08.259: W/Picker(7750): onTextChanged: 10, 0, 2, 2
06-01 18:21:08.259: W/Picker(7750): aftertextchanged: 10
06-01 18:21:08.259: W/Picker(7750): beforeTextChanged: Jun, 0, 3, 3
06-01 18:21:08.259: W/Picker(7750): onTextChanged: Jun
06-01 18:21:08.259: W/Picker(7750): onTextChanged: Jul, 0, 3, 3
06-01 18:21:08.269: W/Picker(7750): aftertextchanged: Jul
06-01 18:21:10.759: I/TAG(7750): Resuming
06-01 18:21:10.759: I/MyActvity(7750): Year = 2014
06-01 18:21:10.759: W/TAG(7750): Resumed
但是,它不会更新
TextView
timeUntil()
。如果不是因为两个问题,我可以相信我在这里做错了什么。首先,当启动时运行
onResume()
时(在
onCreate()
之后),会更新
timeUntil()
;其次,如果更改屏幕方向,会更新
timeUntil()
。我知道屏幕的重新定向会重新运行
onCreate()
,这表明
onResume()
onCreate()
之后工作,但在单独运行时不工作。我完全不知所措

有人有什么想法吗

根据Proxy32(见下文)的输入,我已将
onResume
void更改为

@Override
protected void onResume() {
    super.onResume();

    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            h.post(new Runnable() {
                @Override
                public void run() {
                    Log.i("TAG", "Resuming");
                    SharedPreferences sharedPreferences = getSharedPreferences("preferences", MODE_PRIVATE);
                    Log.i("MyActvity", "Year = " + sharedPreferences.getInt("year", Calendar.YEAR));

                    leaving.set(sharedPreferences.getInt("year", Calendar.YEAR), sharedPreferences.getInt("month", Calendar.MONTH),
                            sharedPreferences.getInt("dayOfMonth", Calendar.DAY_OF_MONTH),
                            sharedPreferences.getInt("hour", Calendar.HOUR_OF_DAY), sharedPreferences.getInt("minute", Calendar.MINUTE));
                    Log.d("TAG", "date " + sdf.format(leaving.getTime()));
                    timeUntil.setText("Time until: " + sdf.format(leaving.getTime()));
                    timeUntil.invalidate();
                    today = Calendar.getInstance();
                    long millisToGo = leaving.getTimeInMillis() - today.getTimeInMillis();
                    long seconds2go = TimeUnit.MILLISECONDS.toSeconds(millisToGo);
                    tvSeconds.setText(String.format("%,d seconds", seconds2go));
                    long minutes2go = TimeUnit.MILLISECONDS.toMinutes(millisToGo);
                    tvMinutes.setText(String.format("%,d minutes", minutes2go));
                    long hours2go = TimeUnit.MILLISECONDS.toHours(millisToGo);
                    tvHours.setText(String.format("%,d hours", hours2go));
                    tvDays.setText(String.format("%,d days %d hours", (int) hours2go / 24, hours2go % 24));
                    long days2go = TimeUnit.MILLISECONDS.toDays(millisToGo);
                    tvWeeks.setText(String.format("%,d weeks %d days", (int) days2go / 7, days2go % 7));
                }
            });
        }
    }, 0, 1000);
    Log.w("TAG", "Resumed");

}

我也移除了阿菲舍尔。这就是我想要它做的。问题已解决。

我不确定我是否理解这个问题,但我会尽力澄清我能做什么

onResume在onCreate之后的onStart(和/或onRestart)之后调用。这就是为什么在您更改屏幕配置或应用程序首次启动后,它会按照您的建议运行

有关详细信息,请参见:


这也意味着当您返回到原始的主活动时,应该更新timeUntil。然而,我在代码中没有看到您正在完成补充活动。另外,您所说的“自行运行”是什么意思?

在设置文本后尝试TextView invalidate()方法

谢谢,是的,我以前看过“活动生命周期”图表。我的问题是,为什么当活动editDate被销毁并且控件返回Days2goActivity时,timeUntil不会更新,特别是当(从日志猫可以看到)onResume()运行时。我的意思是,当onResume()在editDate活动销毁后运行时(即不运行onCreate(),因此“自行运行”),TimeTill不会更新,当onResume在onCreate之后运行时(启动时或方向更改时),TimeTill会更新。将onResume()更改为TimeTill.setText(“Time Till:”+sdf.format)(leaving.getTime());timeUntil.invalidate();不幸的是,没有效果。请为我尝试一个测试Log.d(TAG,“date”+sdf.format(leaving.getTime()));很乐意。在新行invalidate()之后,你想让我在onResume中将标记放在哪里?在@Proxy32处完成。下面是(并不奇怪但仍然令人困惑的)结果,logcat的最后4行(之前的所有行都与上述类似,发生在editDate销毁之前。06-02 05:43:37.039:I/TAG(1391):恢复06-02 05:43:37.039:I/MyActivity(1391):Year=2015 06-02 05:43:37.039:D/TAG(1391):日期Thu 09-Jul-2015 10:00 06-02 05:43:37.059:W/TAG(1391):ResumedOk所以我又看了一遍你的代码。你有一个运行在UI线程上的r,它启动了执行一些UI更新的afficher方法。问题是你不能从另一个线程更新UI。所以试试handler.post(new runnable(){@Override public void run()){//在这里添加任何UI更新,即.tvDays.setText(“so on”);}});我不断的研究使我相信代码是正确的,它应该可以工作。然而,我感到放心的是,其他人似乎也有类似的问题,即使建议的策略在我的情况下不起作用:例如invalidate().