我希望能够在指定的延迟后调用以下方法.在目标c中有类似的东西:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Run Code Online (Sandbox Code Playgroud)
android中有没有与java相同的方法?例如,我需要能够在5秒后调用方法.
public void DoSomething()
{
//do something here
}
Run Code Online (Sandbox Code Playgroud) 我已经调查了这个问题好几个月了,想出了不同的解决方案,我不满意,因为它们都是大规模的黑客攻击.我仍然无法相信一个设计有缺陷的课程已经进入框架而没有人在讨论它,所以我想我一定要错过一些东西.
问题在于AsyncTask.根据它的文件
"允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序."
然后该示例继续示出如何showDialog()调用一些示例性方法onPostExecute().然而,这对我来说似乎完全是设计的,因为显示一个对话框总是需要引用一个有效的Context,而AsyncTask 绝不能保持对上下文对象的强引用.
原因很明显:如果活动被破坏而触发任务怎么办?这可能一直发生,例如因为你翻转了屏幕.如果任务将持有对创建它的上下文的引用,那么您不仅要继续使用无用的上下文对象(窗口将被销毁,并且任何 UI交互都会因异常而失败!),您甚至可能会创建一个内存泄漏.
除非我的逻辑在这里有缺陷,否则转换为:onPostExecute()完全没用,因为如果你没有访问任何上下文,这个方法在UI线程上运行有什么用?你不能在这里做任何有意义的事情.
一种解决方法是不将上下文实例传递给AsyncTask,而是传递给Handler实例.这是有效的:因为Handler松散地绑定了上下文和任务,所以你可以在它们之间交换消息而不会有泄漏的风险(对吧?).但这意味着AsyncTask的前提,即您不需要打扰处理程序,是错误的.它似乎也滥用了Handler,因为你在同一个线程上发送和接收消息(你在UI线程上创建它并在onPostExecute()中通过它发送它也在UI线程上执行).
最重要的是,即使使用了这种解决方法,您仍然会遇到这样的问题:当上下文被破坏时,您没有记录它触发的任务.这意味着您必须在重新创建上下文时重新启动任何任务,例如在屏幕方向更改后.这是缓慢而浪费的.
我对此的解决方案(在Droid-Fu库中实现)是维护WeakReferences从组件名称到其唯一应用程序对象上的当前实例的映射.每当启动AsyncTask时,它都会在该映射中记录调用上下文,并且在每次回调时,它将从该映射中获取当前上下文实例.这可以确保您永远不会引用陈旧的上下文实例,并且您始终可以访问回调中的有效上下文,这样您就可以在那里进行有意义的UI工作.它也不会泄漏,因为引用很弱并且在没有给定组件的实例存在时被清除.
尽管如此,这是一个复杂的解决方法,需要对一些Droid-Fu库类进行子类化,这使得这种方法非常具有侵入性.
现在我只想知道:我是否只是大量遗漏某些东西,或者AsyncTask是否真的完全有缺陷?您的使用经验如何?你是怎么解决这些问题的?
感谢您的输入.
我想要实现的基本上是"on ng repeat finished rendering"处理程序.我能够检测到它何时完成,但我无法弄清楚如何从中触发一个功能.
检查小提琴:http://jsfiddle.net/paulocoelho/BsMqq/3/
JS
var module = angular.module('testApp', [])
.directive('onFinishRender', function () {
return {
restrict: 'A',
link: function (scope, element, attr) {
if (scope.$last === true) {
element.ready(function () {
console.log("calling:"+attr.onFinishRender);
// CALL TEST HERE!
});
}
}
}
});
function myC($scope) {
$scope.ta = [1, 2, 3, 4, 5, 6];
function test() {
console.log("test executed");
}
}
Run Code Online (Sandbox Code Playgroud)
HTML
<div ng-app="testApp" ng-controller="myC">
<p ng-repeat="t in ta" on-finish-render="test()">{{t}}</p>
</div>
Run Code Online (Sandbox Code Playgroud)
答案:来自finishmove的工作小提琴:http …
我正在使用jQuery v.1.7.1,其中.live()方法显然已被弃用.
我遇到的问题是,当使用以下方法动态将html加载到元素中时:
$('#parent').load("http://...");
Run Code Online (Sandbox Code Playgroud)
如果我之后尝试添加click事件,则不会使用以下任一方法注册事件:
$('#parent').click(function() ...);
Run Code Online (Sandbox Code Playgroud)
要么
// according to documentation this should be used instead of .live()
$('#child').on('click', function() ...);
Run Code Online (Sandbox Code Playgroud)
实现此功能的正确方法是什么?它似乎只适用于.live(),但我不应该使用该方法.请注意,#child是动态加载的元素.
谢谢.
我想在Java中做这样的事情,但我不知道如何:
当事件"对象1说'你好''发生时,对象2通过说"你好"来响应该事件.
有人可以给我一个提示或示例代码吗?
我使用转换我的代码Handler来AsyncTask.后者非常擅长它 - 在主UI线程中异步更新和处理结果.我不清楚的是,如果出现问题,如何处理异常AsyncTask#doInBackground.
我这样做的方法是有一个错误处理程序并向它发送消息.它工作正常,但它是"正确的"方法还是有更好的选择?
另外我理解如果我将错误处理程序定义为Activity字段,它应该在UI线程中执行.但是,有时(非常不可预测)我会得到一个异常,说触发的代码Handler#handleMessage是在错误的线程上执行的.我应该初始化错误处理程序Activity#onCreate吗?放置runOnUiThread到Handler#handleMessage似乎是多余的,但执行非常可靠.
我是要创建一个使用a UINavigationController来呈现下一个视图控制器的应用程序.iOS5有一种新的呈现方法UIViewControllers:
presentViewController:animated:completion:
Run Code Online (Sandbox Code Playgroud)
现在我问我为什么没有完成处理程序UINavigationController?只有
pushViewController:animated:
Run Code Online (Sandbox Code Playgroud)
是否有可能像新的一样创建自己的完成处理程序presentViewController:animated:completion:?
假设我想每10秒执行一次操作,并不一定需要更新视图.
问题是:使用带有timertask的计时器是否更好(我的意思是更有效率和更有效),如下所示:
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
Run Code Online (Sandbox Code Playgroud)
或者只是一个带有postdelayed的处理程序
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
Run Code Online (Sandbox Code Playgroud)
如果您能解释何时使用哪种方法以及为什么其中一种方法比另一种方法更有效(如果它实际上是这样),我将不胜感激.
我查了官方的Android文档/指南Looper,Handler和MessageQueue.但我无法得到它.我是android新手,对这些概念非常困惑.
我通过新的Handler()调用多个处理程序.postDelayed(new Runnable().....如果单击返回按钮,我怎么能阻止它?
public class MyActivity extends AppCompatActivity implements OnClickListener {
private Button btn;
private Handler handler;
private Runnable myRunnable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btn = (Button) findViewById(R.id.trainingsstart);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Handler handler = new Handler();
Runnable myRunnable = new Runnable() {
public void run() {
// Things to be done
}
};
handler.postDelayed(myRunnable, 3000);
}
@Override
public void onBackPressed() {
super.onBackPressed();
handler.removeCallbacks(myRunnable);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个问题,我的处理程序没有像"myHandler"这样的名字.我该怎么处理?感谢帮助!
现在我收到了这些错误:
03-28 17:47:03.662: E/AndroidRuntime(1961): FATAL EXCEPTION: main …Run Code Online (Sandbox Code Playgroud) handler ×10
android ×6
events ×3
java ×2
angularjs ×1
concurrency ×1
delay ×1
directive ×1
dom ×1
ios ×1
javascript ×1
jquery ×1
listener ×1
looper ×1
performance ×1
postdelayed ×1
ready ×1
timer ×1
timertask ×1