我正在重写我的Android
应用程序,以消除对onResume()
的直接调用。
我的应用程序目前在onResume()
中完成了大部分工作,然后发布显示,这就是onResume()
的结束。
@Override
public void onResume() {
super.onResume();
// get current date and time,
// and determine if daylight savings time is in effect.
//...600 lines of code
// output both the chart and report
//
image.setImageBitmap(heightChart);
report.setImageBitmap(reportBitmap);
}
下一步是收集用户输入,它告诉我用户希望对报告进行哪些更改。(可以是新的位置、新的日期或新的显示样式等)。这是按如下方式完成的:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int STATION_REQUEST = 1;
int test = 1;
switch (item.getItemId()) {
case R.id.refresh: {
userDateSet = false;
onResume();
return true;
} // come to the present.
//...200 lines of code
default:
return super.onOptionsItemSelected(item);
}
}
如示例所示,在确定新的user命令后,通过调用onResume()
重新生成输出。这是不好的做法,我已经知道了!然而,据我所知,它工作得很好,老实说,我不明白它的问题所在。
我考虑的解决方案是将600行代码收集到一个单独的例程中,然后从onResume()
和onOptionsItemSelected()
中的多个点调用该例程
@Override
public void onResume() {
super.onResume();
myOnResumeCode();
}
在onOptionsItemSelected()
内部做这件事
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int STATION_REQUEST = 1;
int test = 1;
switch (item.getItemId()) {
case R.id.refresh: {
userDateSet = false;
myOnResumeCode();
return true;
} // come to the present.
... // Other statements
}
这种方法可以接受吗?如果没有,除了“重写整个东西”之外的任何建议都会对我很有帮助。我已经广泛地寻找了一个干净的解决方案,但没有找到一个我能理解的。谢谢。
发布于 2018-06-15 23:16:17
这是我的最终代码,感谢Ahamad的出色指导。我现在再也不调用onResume()了。在不同的地方,我调用myOnResume()。part1()代码是所有扩展计算。part2()代码是所有的输出操作。
@Override
public void onResume()
{ super.onResume();//
myOnResume();
}// end: onResume.
void myOnResume()
{ new Thread(new Runnable()
{ public void run() //run #1
{ part1(); // do all the calculations in background.
runOnUiThread(new Runnable()
{ public void run() //run #2
{ part2(); // do the display in the UI thread.
} //end of run#2
}); //end of runOnUiThread
} //end of run#1
}).start();
} //end: myOnResume()
https://stackoverflow.com/questions/50643571
复制相似问题