就Android SDK而言,这可能没什么意义,但是,在C ++中,我习惯将main.cpp(特别是main()函数)保存为我声明和初始化其他类/对象的地方,之后我的申请所做的所有事情都发生在那些课程中。之后我再也没有回来检查main.cpp中的任何东西。 但是在Java,Android SDK中,您必须覆盖主要活动中的许多方法,并且所有方法都在一个文件中进行。例如:
我的项目中有一个MainActivity.java和SomeTest.java文件,其中第一个是默认的MainActivity类,它扩展了Activity,SomeTest.java包含声明和运行新Thread的类。我从MainActivity.java初始化SomeTest类,并将活动的句柄作为参数传递给它:
SomeTest test = new SomeTest(MainActivity.this);
拥有MainActivity的句柄,我继续从这个新创建的线程做一切。当我需要更新UI时,我使用runOnUiThread()在我的主布局上创建并显示一个新的ListView(例如)。我想得到新创建的Listview的宽度和高度,因为我必须在MainActivity.java中覆盖onWindowFocusChanged()并从那里通知线程,因为getWidth()和getHeight()只有ListView时才有值实际显示在屏幕上。对我来说,从MainActivity到该线程进行这样的连接('回调',如果你愿意的话)并不是一个好习惯。
有没有办法可以在线程中保留像onWindowFocusChanged()这样的方法,并且根本不接触MainActivity.java?
正如我所说,可能没什么意义。
答案 0 :(得分:4)
有没有办法可以在线程中保留像onWindowFocusChanged()这样的方法,而根本不接触MainActivity.java?
onWindowFocusChanged()
是一种回调方法。它被称为活动。你无法改变这一点。
拥有MainActivity的句柄,我继续从这个新创建的线程做一切。
这通常不是一个好主意。使用后台线程,比如从文件或数据库加载一些数据是完全合理的(尽管使用Loader
或AsyncTask
可能更好)。但是,通常,后台线程既不知道也不关心“新创建的ListView的宽度和高度”等事情。
当然欢迎您将某些逻辑从活动中迁移到其他类中。您可以使用特定的框架,例如片段或自定义视图。但是,类结构不应由您的线程模型驱动。例如,让我们回到你的开场白:
在C ++中我习惯将main.cpp(特别是main()函数)保存为我声明和初始化其他类/对象的地方,然后我的应用程序在这些类中发生的所有事情< / p>
但是,在C ++中,你不会说你被锁定只有两个类,其中一个是在一些后台线程上运行。虽然你可能有一个或多个类碰巧使用后台线程(或线程),但类结构背后的驱动力不是“我有一个后台线程”而是“我想重用XYZ逻辑”或“我希望使用类层次结构来支持策略模式“或某些此类。
答案 1 :(得分:1)
从Android SDK中获取的个人Context
想法似乎很混乱。你所描述的内容来自Activity
的过多责任。这就是为什么你需要在单个文件(Activity
的生命周期内跟踪大量内容,获取Context
实例以显示Dialog
等等。我不认为有完美的解决方案,但我建议使用:
Fragment
子类有助于将屏幕(等逻辑)划分为单独的部分答案 2 :(得分:0)
如果您想要从其他类执行某些UI更新,请考虑使用AsyncTask向其传递您需要更新的视图。如果您需要一个示例,请告诉我
答案 3 :(得分:0)
我阅读了所有内容并理解了你的陈述,我可以看到你一直在做编程,但显然刚刚开始使用Android,我之前已经完成了很多嵌入式系统,所以我完全得到了拥有软件的概念看起来像是:
void run(){
object.setup();
while(true){
otherObject.run();
}
}
但是你的问题逻辑存在一个根本性的缺陷:
Android编程是一种与C ++和计算机编程不同的编程范式,您应该了解其特定的范例,而不是假设其他范例的优秀实践。
引用你:create and show a new ListView (for example) on my main layout. I want to get the width and height of the newly created Listview, for what I have to override onWindowFocusChanged()
。
从中可以看出,你真的试图以Android上下文不推荐的方式做Android内容。您可以从XML布局setContentView(int)
轻松实现ListView,并使用Activity onCreate实例化任何线程(AsyncTaskLoader)框架,以在后台加载数据并将其传回UI。
这并不意味着您的所有代码都将被转储到一个文件中,使其变得一团糟。我给你的这个小例子可以用于实现加载器回调的Activity,带有加载器的单独类,带有数据加载工作的单独类,带有数据适配器的单独类,活动只是组织的一个中心部分,在生命周期的正确时刻管理这些类,在任何时候你都不需要调用onWindowFocusChanged()
并且仍然有一个组织良好的代码。
除此之外,请参阅CommonsWare的答案,因为它通常写得很巧妙。