我稍微感到困惑之间的差异Handlers,AsyncTask并Threads在Android中.我在stackoverflow中阅读了很多博客和问题.
Handler是后台线程,提供您与UI进行通信.例如,更新进度条应该通过Handler.使用处理程序可以获得优势MessagingQueues,因此,如果要计划消息或更新多个UI元素或具有重复任务.
AsyncTask类似的,实际上它们使用Handler但不在UI线程中运行,因此它对于获取数据很有用,例如获取Web服务.稍后您可以与UI进行交互.
Thread然而,无法与UI交互,提供更多"基本"线程,你错过了所有的抽象AsyncTask.
但是,我想在服务中运行套接字连接.应该在处理程序或线程中运行,还是在AsyncTask?根本不需要UI交互.它在我使用的性能方面有所不同吗?
与此同时,文件已得到重大改进.
在android服务中,我创建了一些用于执行某些后台任务的线程.
我有一种情况,线程需要在主线程的消息队列上发布某些任务,例如a Runnable.
有没有办法获得Handler主线程并从我的其他线程发布Message/ Runnable到它?
谢谢,
我正在开发一个带有服务的Android 2.3.3应用程序.我在服务中有这个与Main活动进行通信:
public class UDPListenerService extends Service
{
private static final String TAG = "UDPListenerService";
//private ThreadGroup myThreads = new ThreadGroup("UDPListenerServiceWorker");
private UDPListenerThread myThread;
/**
* Handler to communicate from WorkerThread to service.
*/
private Handler mServiceHandler;
// Used to receive messages from the Activity
final Messenger inMessenger = new Messenger(new IncomingHandler());
// Use to send message to the Activity
private Messenger outMessenger;
class IncomingHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
}
}
/**
* Target we …Run Code Online (Sandbox Code Playgroud) android memory-leaks static-classes android-lint android-handler
我正在使用handler.postDelayed()我的应用程序的下一个阶段之前创建一个等待期.在等待期间,我显示一个带有进度条和取消按钮的对话框.
我的问题是我找不到在时间流逝之前取消postDelayed任务的方法.
如何修复此代码中的弃用警告?或者,还有其他选择吗?
Handler().postDelayed({
context?.let {
//code
}
}, 3000)
Run Code Online (Sandbox Code Playgroud) 当我需要异步运行某些东西时,例如长时间运行的任务或使用网络的逻辑,或者出于任何原因,启动新线程并运行它可以正常工作.创建一个处理程序并运行它也可以.有什么不同?我什么时候应该使用每一个?使用a Handler而不是a 的优点/原因是Thread什么?
PS.- 为了这个问题,让我们忽略AsyncTask.- Handler().postDelayed用例对我来说很清楚,对于这个问题,我们假设我需要立即启动任务.
我通过新的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在我的应用程序中使用a .但是当我像这样实例化时:
Handler handler = new Handler();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
Gradle: error: Handler is abstract; cannot be instantiated
Run Code Online (Sandbox Code Playgroud)
当我检查解决方案时,它要求我实现这些方法:
Handler handler = new Handler() {
@Override
public void close() {
}
@Override
public void flush() {
}
@Override
public void publish(LogRecord record) {
}
};
Run Code Online (Sandbox Code Playgroud)
我以前从未使用Handlers过,我只是在经过一段时间后调用方法.为此,我使用了:
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
}
}, 100);
Run Code Online (Sandbox Code Playgroud)
但它显示错误:
Gradle: error: cannot find symbol method postDelayed(<anonymous Runnable>,int)
Run Code Online (Sandbox Code Playgroud)
请帮忙!提前致谢.
我试图了解使用的最佳用例HandlerThread.
根据定义:
"用于启动具有looper的新线程的方便类.然后可以使用looper来创建处理程序类.请注意,仍然必须调用start()."
我可能是错的,但类似的功能,我可以通过使用实现Thread,Looper和Handler.那么我HandlerThread什么时候应该使用?一个例子真的很有帮助.
android ×10
android-handler ×10
java ×4
postdelayed ×2
android-lint ×1
callback ×1
handler ×1
kotlin ×1
memory-leaks ×1