我有一个"长期运行"的清理操作,我需要在onDestroy()我的操作中执行Activity.做这个的最好方式是什么?
如果我用a Thread来做这件事,我onDestroy()会马上回来; 但是线程参考会发生什么?我正在寻找关于我需要注意的任何含义/陷阱/跳线的建议,因为我认为即使在Activity被销毁之后该过程仍然存在.
我在我的应用程序中使用JmDNS.当用户完成我的应用程序后,我想清理JmDNS实例.我这样做是使用类的close()方法JmDNS.但是,此方法需要5秒以上才能完成.结果,用户Activity在触摸后退键后长时间看到我的屏幕.
我还没弄清楚为什么close()需要这么长时间,但同时我也意识到我真的不需要等待近距离成功完成.我所需要的是一种"触发"关闭并完成它的方法.
好吧,这是我遇到的一个非常奇怪的问题,而且我很确定我在某个地方搞乱了,但我无法弄清楚在哪里.
我在想的是 -
Timer执行TimerTask一次TimerTask又执行一个AsyncTask(在这种情况下,简单的休眠的第二返回AsyncTasks的数目的静态计数之前).当然,已经使用适当的Handlers和Runnables将异步消息从其他线程发布到UI.
此代码仅执行一次.我希望它每5秒发射一次.这是代码.
注意:我不知道如何处理Looper.经过反复试验,我把它放在那里!
public class TimerAsyncMixActivity extends Activity {
public static final String TAG = "TimerAsyncMix";
static int executionCount = 0;
Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new Timer().schedule(new MyTimerTask(this), 0, 5000);
}
class MyAsyncTask extends AsyncTask<String, Void, Integer>{
@Override
protected Integer doInBackground(String... params) {
try {
Thread.sleep(1000);
} catch (InterruptedException …Run Code Online (Sandbox Code Playgroud) 我想首先提一下,我的问题源于Java中的接口不允许静态方法.有关SO的原因的讨论(例如,这里).所以不要纠缠于此.我正在寻找一种方法让我的界面创建自己的实例(而不是它的实现)并返回它.尽管使用了Singleton模式,Factory和AbstractFactory模式,我仍然无法实现我的目标.
详细说明我正在尝试的内容 - 这是我的界面:
public interface NoteDataStore {
public boolean deleteNote(long noteId);
public boolean addNote(Note note);
public List<Note> listNotes();
public boolean editNote(long noteId, Note note);
public List<Note> search(String searchString);
}
Run Code Online (Sandbox Code Playgroud)
这是我的业务逻辑层:
public class BusinessLogicLayer {
public BusinessLogicLayer(){
/*
* GOAL: To get an instance of NoteDataStore here,
* without being aware of the implementation class.
*/
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用像这样的工厂模式:
public interface NoteDataStoreFactory {
public NoteDataStore getDataStoreInstance();
}
public class NoteDataStoreFactoryImpl implements NoteDataStoreFactory{
public NoteDataStore getDataStoreInstance(){
return NoteDataStoreImpl.getInstance();
/* …Run Code Online (Sandbox Code Playgroud) 有效的Java(Joshua Bloch)第17项说:
"设计和文件或继承或禁止它"
然而,只是粗略地浏览Android API就会发现大多数API类都是非最终的; 这是确定的,如果它们也记录为(继承View的Activity,例如).但是也有几个非final类,但是文档没有提到这些类的可继承性.只是一些任意的例子来说明我的观点:
WifiManager,NotificationManager...)UriMatcher.Camera.开放性和可扩展性是Android的哲学,这里的惯例是否反过来?意思是,可以假设所有 Android API类都被设计为继承(无论是明确记录还是其他); 除非宣布最后?
在我的Android应用程序中,我正在提取代码以将UI元素更新为单独的实用程序包以供重用.如果当前执行上下文来自UI线程而非非UI线程,我希望我的代码是主动的并以不同方式更新UI.
是否有可能以编程方式确定当前执行是否发生在UI线程上?
我想要实现的一个简单的例子就是这个 - 我的应用程序一直在更新很多内容TextView.所以,我想有一个像这样的静态实用程序:
public static void setTextOnTextView(TextView tv, CharSequence text){
tv.setText(text);
}
Run Code Online (Sandbox Code Playgroud)
如果从非UI线程调用,这显然不起作用.在这种情况下,我想强制客户端代码也传入Handler,并将UI操作发布到处理程序.
这个要求出现在我的Android应用程序中,但它一般适用于Java.我的应用程序每隔几秒就"做一些事".我已经实现了如下(只是相关的片段 - 不是完整的代码):
Snippet1:
public class PeriodicTask {
private boolean running = true;
private int interval = 5;
public void startTask(){
while (running){
doSomething();
try{
Thread.sleep(interval * 1000);
} catch(InterruptedException e){
//Handle the exception.
}
}
}
public void stopTask(){
this.running = false;
}
public void setInterval(int newInterval){
this.interval = newInterval;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这种方法的问题是setInterval()不会立即生效.它仅在前一个sleep()完成后生效.
由于我的用例允许最终用户以固定步长(1秒 - 从1到60秒)设置间隔,因此我将实现修改为在循环内休眠; 并按如下方式每秒检查新的间隔值:
Snippet2:
public class PeriodicTask {
private boolean running = true;
private int interval = 5;
private int loopCounter = 0;
public void …Run Code Online (Sandbox Code Playgroud) 由于历史原因,我在下面保留原始问题.但是,我发现这个问题并不孤立FrameLayout.因此,更新了标题.
我没有用更多的代码过度拥挤这篇文章,而是创建了一个示例项目来演示这个问题; 并将其上传到Google Project Hosting.
问题的摘要是这样的:
纵向可绘制,其上设置有特定边界,在改变方向并返回纵向时,不保留设定边界.相反,它恢复到原来的界限.尽管有力地设定了方向变化的明确界限.请注意,您遵守以后在Click等上设置的任何边界都会被遵守.
我还上传了一个版本的应用程序,其中包含2个单独的活动来说明问题.
BitmapDrawable上ImageView-这一个打印边界时被更改日志.第二个版本清楚地表明,即使我在Drawable上设置了边界,这些边界也没有被遵守onBoundsChange().
原始问题:
我使用的是FrameLayout具有2个ImageView小号一个堆叠在另一个用于显示"电池状态"的图形的顶部.这是纵向模式.在横向模式下,我显示不同的布局(图表).
我的问题是这个 - 假设电池状态正在显示 - 比如说30%.现在,我旋转屏幕并显示图表.当我回到纵向方向时,电池图形将返回其原始位置("已满").
我尝试了各种各样的事情来弄清楚发生了什么.调试向我显示"顶部"图形的边界确实按预期设置.所以这似乎是一个无效的问题.我将介绍2个类和2个布局XML(全部简化)的代码,这有助于重现问题.还附加用于ImageView的占位符PNG.

谁能发现错误?要重新创建该问题,请运行该应用程序,然后单击"更新"按钮.图形将被"填充"到一定水平.然后,切换到横向,然后返回到肖像.图形不记得它的早期值.
活动:
public class RotateActivity extends Activity {
private View portraitView, landscapeView;
private LayoutInflater li;
private Configuration mConfig;
private ValueIndicator indicator;
private Button btn;
private Random random = new java.util.Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
li = LayoutInflater.from(this);
portraitView = …Run Code Online (Sandbox Code Playgroud) android invalidation screen-orientation android-imageview android-framelayout
我正在尝试使用ViewPagerIndicator中的"Sample Styled Tabs"示例将标签文本显示为2行.这是我到目前为止所做的:
在SampleTabsStyled.java,我做了以下更改GoogleMusicAdapter.注意我添加到标题字符串的新行字符:
@Override
public CharSequence getPageTitle(int position) {
StringBuilder sb = new StringBuilder(CONTENT[position % CONTENT.length].toUpperCase());
sb.append("\n");
sb.append(RANDOM.nextInt(1000));
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)在styles.xml,我做了以下改变:
<style name="CustomTabPageIndicator.Text" parent="android:TextAppearance.Medium">
<item name="android:typeface">monospace</item>
<item name="android:singleLine">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)但是,我只看到VPI选项卡中的第一行文本.我没有看到第二行数字.我可能做错了什么?
如何在Android中使用资源限定符系统指定仅在宽度小于特定值时才应用资源?
详细说来,假设我想在当前可用宽度达到 - 比如320dp时 - 提供一个布局,并为所有其他情况提供另一个布局.这就是我想到的:
layout-w320dp/mylayout.xml
layout/mylayout.xml
Run Code Online (Sandbox Code Playgroud)
但是,根据我对资源匹配算法的理解,即使是大型设备(例如,横向平板电脑)也有资格w320dp- 因为,可用宽度将大于320dp.
因此,即使对于较大的手机和平板电脑,layout-w320dp也始终会选择资源.layout选择文件夹中的默认资源的唯一情况是可用宽度是否小于 320dp.
那么,如何使用Android资源匹配系统表达"小于"的关系呢?
我试图通过循环从异步调用返回的数组来动态生成测试。我只是不知道如何做到这一点 - 无论是使用 mocha 还是使用 jest。为了说明使用代码,以下同步示例有效:
describe("Test using various frameworks", () => {
["mocha", "jest"].forEach(framework => {
it(`Should test using ${framework}`, () => {
expect(true).toBe(true);
});
});
});
Run Code Online (Sandbox Code Playgroud)
但是,如果该数组是异步获取的,则我无法让测试框架等到数组被获取后再尝试对其进行循环。
async function getFrameworks() {
//TODO: get it from some async source here
return ["mocha", "jest"];
}
describe("Test using various frameworks", () => {
var frameworks;
//before() instead of beforeAll() if using mocha
beforeAll(async ()=> {
frameworks = await getFrameworks();
});
frameworks.forEach(framework => {
it(`Should test using ${framework}`, () => {
expect(true).toBe(true); …Run Code Online (Sandbox Code Playgroud) 使用HERE Android SDK Premium,在使用NavigationManager#simulate()方法时,如果添加NavigationManager.GpsSignalListener,即使在模拟器上运行时打开/关闭GPS,也不会调用侦听器回调。
NavigationManager在模拟模式下运行时,如何接收GPS信号事件?
问题:
如何在使用Simple框架时从序列化的XML中消除不必要的空格字符?
细节:
让我们从Simple框架网站上考虑这个非常基本的例子.XML输出是:
<example index="123">
<text>Example message</text>
</example>
Run Code Online (Sandbox Code Playgroud)
如何指示序列化程序输出?
<example index="123"><text>Example message</text></example>
我检查了org.simpleframework.xml.stream.Style界面,但它似乎只能处理单个元素和属性名称而不是内容.
android ×9
java ×4
asynchronous ×1
handler ×1
here-api ×1
invalidation ×1
jestjs ×1
jmdns ×1
lifecycle ×1
looper ×1
mocha.js ×1
sleep ×1
timertask ×1
whitespace ×1