英文:
What do I use now that Handler() is deprecated?
问题
这段代码中的弃用警告如何修复?或者,还有其他任何处理方式吗?
Handler().postDelayed({
context?.let {
//代码
}
}, 3000)
英文:
How do I fix the deprecation warning in this code? Alternatively, are there any other options for doing this?
Handler().postDelayed({
context?.let {
//code
}
}, 3000)
答案1
得分: 663
只有无参数构造函数已被弃用,现在更推荐通过构造函数使用Looper.getMainLooper()
方法来指定Looper
。
在Java中使用
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
// 你的代码
}
}, 3000);
在Kotlin中使用
Handler(Looper.getMainLooper()).postDelayed({
// 你的代码
}, 3000)
英文:
Only the parameterless constructor is deprecated, it is now preferred that you specify the Looper
in the constructor via the Looper.getMainLooper()
method.
Use it for Java
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
// Your Code
}
}, 3000);
Use it for Kotlin
Handler(Looper.getMainLooper()).postDelayed({
// Your Code
}, 3000)
Source : developer.android.com
答案2
得分: 90
从API级别30开始,有2个已被弃用的构造函数。
Google解释了以下原因。
在Handler构造期间隐式选择一个Looper可能导致操作被默默丢失(如果Handler不希望有新任务并退出),崩溃(如果有时在线程上创建没有活动Looper的Handler),或者竞态条件,其中与Handler关联的线程与作者预期的不同。相反,使用Executor或明确指定Looper,使用Looper#getMainLooper、android.view.View#getHandler或类似的方法。如果需要兼容性的隐式线程本地行为,请使用new Handler(Looper.myLooper(), callback)以便读者清晰明了。
解决方案1: 使用Executor
1. 在主线程中执行代码。
Java
// 创建一个在主线程中执行任务的Executor。
Executor mainExecutor = ContextCompat.getMainExecutor(this);
// 在主线程中执行任务
mainExecutor.execute(new Runnable() {
@Override
public void run() {
// 你的代码逻辑在这里。
}
});
Kotlin
// 创建一个在主线程中执行任务的Executor。
val mainExecutor = ContextCompat.getMainExecutor(this)
// 在主线程中执行任务
mainExecutor.execute {
// 你的代码逻辑在这里。
}
2. 在后台线程中执行代码
Java
// 创建一个在后台线程中执行任务的Executor。
ScheduledExecutorService backgroundExecutor = Executors.newSingleThreadScheduledExecutor();
// 在后台线程中执行任务
backgroundExecutor.execute(new Runnable() {
@Override
public void run() {
// 你的代码逻辑在这里。
}
});
// 在3秒后在后台线程中执行任务。
backgroundExecutor.schedule(new Runnable() {
@Override
public void run() {
// 你的代码逻辑在这里。
}
}, 3, TimeUnit.SECONDS);
Kotlin
// 创建一个在后台线程中执行任务的Executor。
val backgroundExecutor: ScheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
// 在后台线程中执行任务
backgroundExecutor.execute {
// 你的代码逻辑在这里。
}
// 在3秒后在后台线程中执行任务。
backgroundExecutor.schedule({
// 你的代码逻辑在这里。
}, 3, TimeUnit.SECONDS)
注意: 使用完后记得关闭Executor。
backgroundExecutor.shutdown(); // 或 backgroundExecutor.shutdownNow();
3. 在后台线程中执行代码并在主线程上更新UI
Java
// 创建一个在主线程中执行任务的Executor。
Executor mainExecutor = ContextCompat.getMainExecutor(this);
// 创建一个在后台线程中执行任务的Executor。
ScheduledExecutorService backgroundExecutor = Executors.newSingleThreadScheduledExecutor();
// 在后台线程中执行任务
backgroundExecutor.execute(new Runnable() {
@Override
public void run() {
// 你的代码逻辑在这里。
// 在主线程上更新UI
mainExecutor.execute(new Runnable() {
@Override
public void run() {
// 你的代码逻辑在这里。
}
});
}
});
Kotlin
// 创建一个在主线程中执行任务的Executor。
val mainExecutor: Executor = ContextCompat.getMainExecutor(this)
// 创建一个在后台线程中执行任务的Executor。
val backgroundExecutor = Executors.newSingleThreadScheduledExecutor()
// 在后台线程中执行任务
backgroundExecutor.execute {
// 你的代码逻辑在这里。
// 在主线程上更新UI
mainExecutor.execute {
// 你的代码逻辑在这里。
}
}
解决方案2: 通过使用以下构造函数之一明确指定一个Looper。
1. 在主线程中执行代码
1.1. 带有Looper的Handler
Java
Handler mainHandler = new Handler(Looper.getMainLooper());
Kotlin
val mainHandler = Handler(Looper.getMainLooper())
1.2 带有Looper和Handler.Callback的Handler
Java
Handler mainHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// 你的代码逻辑在这里。
return true;
}
});
Kotlin
val mainHandler = Handler(Looper.getMainLooper(), Handler.Callback {
// 你的代码逻辑在这里。
true
})
2. 在后台线程中执行代码
2.1. 带有Looper的Handler
Java
// 创建一个具有Looper的后台线程
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// 创建一个在后台线程中执行任务的Handler。
Handler backgroundHandler = new Handler(handlerThread.getLooper());
Kotlin
// 创建一个具有Looper的后台线程
val handlerThread = HandlerThread("HandlerThread")
handlerThread.start()
// 创建一个在后台线程中执行任务的Handler。
val backgroundHandler = Handler(handlerThread.looper)
2.2. 带有Looper和Handler.Callback的Handler
Java
// 创建一个具有Looper的后台线程
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// 创建一个在后台线程中执行任务的Handler。
Handler backgroundHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// 你的代码逻辑在这里。
return true;
}
});
Kotlin
// 创建一个具有Looper的后台线程
val handlerThread = HandlerThread("HandlerThread")
handlerThread.start()
// 创建一个在后台线程中执行任务的Handler。
val backgroundHandler = Handler(handlerThread.looper, Handler.Callback {
// 你的代码逻辑在这里。
true
})
注意: 使用完后记得释放线程。
handlerThread.quit(); // 或 handlerThread.quitSafely();
3. 在后台线程中执行代码并在主线程上更新UI
Java
// 创建一个在主线程中执行代码的Handler
Handler mainHandler = new Handler(Looper.getMainLooper());
// 创建一个具有Looper的后台线程
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// 创建一个在后台线程中执行任务的Handler。
Handler backgroundHandler = new Handler
英文:
From API level 30, there are 2 constructors that are deprecated.
Google explains the reason below.
> Implicitly choosing a Looper during
> Handler construction can lead to bugs where operations are silently
> lost (if the Handler is not expecting new tasks and quits), crashes
> (if a handler is sometimes created on a thread without a Looper
> active), or race conditions, where the thread a handler is associated
> with is not what the author anticipated. Instead, use an Executor or
> specify the Looper explicitly, using Looper#getMainLooper, {link
> android.view.View#getHandler}, or similar. If the implicit thread
> local behavior is required for compatibility, use new
> Handler(Looper.myLooper(), callback) to make it clear to readers.
Solution 1: Use an Executor
1. Execute code in the main thread.
Java
// Create an executor that executes tasks in the main thread.
Executor mainExecutor = ContextCompat.getMainExecutor(this);
// Execute a task in the main thread
mainExecutor.execute(new Runnable() {
@Override
public void run() {
// You code logic goes here.
}
});
Kotlin
// Create an executor that executes tasks in the main thread.
val mainExecutor = ContextCompat.getMainExecutor(this)
// Execute a task in the main thread
mainExecutor.execute {
// You code logic goes here.
}
2. Execute code in a background thread
Java
// Create an executor that executes tasks in a background thread.
ScheduledExecutorService backgroundExecutor = Executors.newSingleThreadScheduledExecutor();
// Execute a task in the background thread.
backgroundExecutor.execute(new Runnable() {
@Override
public void run() {
// Your code logic goes here.
}
});
// Execute a task in the background thread after 3 seconds.
backgroundExecutor.schedule(new Runnable() {
@Override
public void run() {
// Your code logic goes here
}
}, 3, TimeUnit.SECONDS);
Kotlin
// Create an executor that executes tasks in a background thread.
val backgroundExecutor: ScheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
// Execute a task in the background thread.
backgroundExecutor.execute {
// Your code logic goes here.
}
// Execute a task in the background thread after 3 seconds.
backgroundExecutor.schedule({
// Your code logic goes here
}, 3, TimeUnit.SECONDS)
Note: Remember to shut down the executor after using.
backgroundExecutor.shutdown(); // or backgroundExecutor.shutdownNow();
3. Execute code in a background thread and update UI on the main thread.
Java
// Create an executor that executes tasks in the main thread.
Executor mainExecutor = ContextCompat.getMainExecutor(this);
// Create an executor that executes tasks in a background thread.
ScheduledExecutorService backgroundExecutor = Executors.newSingleThreadScheduledExecutor();
// Execute a task in the background thread.
backgroundExecutor.execute(new Runnable() {
@Override
public void run() {
// Your code logic goes here.
// Update UI on the main thread
mainExecutor.execute(new Runnable() {
@Override
public void run() {
// You code logic goes here.
}
});
}
});
Kotlin
// Create an executor that executes tasks in the main thread.
val mainExecutor: Executor = ContextCompat.getMainExecutor(this)
// Create an executor that executes tasks in a background thread.
val backgroundExecutor = Executors.newSingleThreadScheduledExecutor()
// Execute a task in the background thread.
backgroundExecutor.execute {
// Your code logic goes here.
// Update UI on the main thread
mainExecutor.execute {
// You code logic goes here.
}
}
Solution 2: Specify a Looper explicitly by using one of the following constructors.
1. Execute code in the main thread
1.1. Handler with a Looper
Java
Handler mainHandler = new Handler(Looper.getMainLooper());
Kotlin
val mainHandler = Handler(Looper.getMainLooper())
1.2 Handler with a Looper and a Handler.Callback
Java
Handler mainHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// Your code logic goes here.
return true;
}
});
Kotlin
val mainHandler = Handler(Looper.getMainLooper(), Handler.Callback {
// Your code logic goes here.
true
})
2. Execute code in a background thread
2.1. Handler with a Looper
Java
// Create a background thread that has a Looper
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// Create a handler to execute tasks in the background thread.
Handler backgroundHandler = new Handler(handlerThread.getLooper());
Kotlin
// Create a background thread that has a Looper
val handlerThread = HandlerThread("HandlerThread")
handlerThread.start()
// Create a handler to execute tasks in the background thread.
val backgroundHandler = Handler(handlerThread.looper)
2.2. Handler with a Looper and a Handler.Callback
Java
// Create a background thread that has a Looper
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// Create a handler to execute taks in the background thread.
Handler backgroundHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// Your code logic goes here.
return true;
}
});
Kotlin
// Create a background thread that has a Looper
val handlerThread = HandlerThread("HandlerThread")
handlerThread.start()
// Create a handler to execute taks in the background thread.
val backgroundHandler = Handler(handlerThread.looper, Handler.Callback {
// Your code logic goes here.
true
})
Note: Remember to release the thread after using.
handlerThread.quit(); // or handlerThread.quitSafely();
3. Execute code in a background thread and update UI on the main thread.
Java
// Create a handler to execute code in the main thread
Handler mainHandler = new Handler(Looper.getMainLooper());
// Create a background thread that has a Looper
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// Create a handler to execute in the background thread
Handler backgroundHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// Your code logic goes here.
// Update UI on the main thread.
mainHandler.post(new Runnable() {
@Override
public void run() {
}
});
return true;
}
});
Kotlin
// Create a handler to execute code in the main thread
val mainHandler = Handler(Looper.getMainLooper())
// Create a background thread that has a Looper
val handlerThread = HandlerThread("HandlerThread")
handlerThread.start()
// Create a handler to execute in the background thread
val backgroundHandler = Handler(handlerThread.looper, Handler.Callback {
// Your code logic goes here.
// Update UI on the main thread.
mainHandler.post {
}
true
})
答案3
得分: 77
如果您想避免在 Kotlin 中进行空值检查(?
或 !!
),可以使用 Looper.getMainLooper()
,如果您的 Handler
用于处理与 UI 相关的内容,可以像这样使用:
Handler(Looper.getMainLooper()).postDelayed({
Toast.makeText(this@MainActivity, "LOOPER", Toast.LENGTH_SHORT).show()
}, 3000)
注意:如果您正在使用片段,请使用 requireContext()
,而不是 this@MainActivity
。
英文:
If you want to avoid the null check thing in Kotlin (?
or !!
) you can use Looper.getMainLooper()
if your Handler
is working with some UI related thing, like this:
Handler(Looper.getMainLooper()).postDelayed({
Toast.makeText(this@MainActivity, "LOOPER", Toast.LENGTH_SHORT).show()
}, 3000)
Note: use requireContext()
instead of this@MainActivity
if you are using fragment.
答案4
得分: 29
已弃用的函数是 Handler 的构造函数。请改用 Handler(Looper.myLooper()).postDelayed(runnable, delay)
。
英文:
The deprecated function is that constructor for Handler. Use Handler(Looper.myLooper()) .postDelayed(runnable, delay)
instead
答案5
得分: 24
请考虑使用协程
scope.launch {
delay(3000L)
// 做一些事情
}
英文:
Consider using coroutines
scope.launch {
delay(3000L)
// do stuff
}
答案6
得分: 21
使用生命周期范围更加简单。在活动或片段内部。
lifecycleScope.launch {
delay(2000)
// 做你的事情
}
或者使用处理程序
Handler(Looper.myLooper()!!)
英文:
Using lifecycle scope this is more easy. Inside activity or fragment.
lifecycleScope.launch {
delay(2000)
// Do your stuff
}
or use handler
Handler(Looper.myLooper()!!)
答案7
得分: 18
我有3个解决方案:
-
显式指定 Looper:
Handler(Looper.getMainLooper()).postDelayed({ // 代码 }, 延迟时间)
-
隐式线程本地行为:
Handler(Looper.myLooper()!!).postDelayed({ // 代码 }, 延迟时间)
-
使用
Thread
:Thread({ try{ Thread.sleep(3000) } catch (e : Exception) { throw e } // 代码 }).start()
英文:
I have 3 solutions:
- Specify the Looper explicitly:
Handler(Looper.getMainLooper()).postDelayed({ // code }, duration)
- Specify the implicit thread local behavior:
Handler(Looper.myLooper()!!).postDelayed({ // code }, duration)
- using
Thread
:Thread({ try{ Thread.sleep(3000) } catch (e : Exception) { throw e } // code }).start()
答案8
得分: 12
Handler()
和Handler(Handler.Callback callback)
构造函数已被弃用,因为它们可能导致错误和崩溃。请明确使用Executor或Looper。
对于Java
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
//在这里执行你的操作
}
}, 1000);
英文:
Handler()
and Handler(Handler.Callback callback)
constructors are deprecated. Because those can leads to bugs & crashes. Use Executor or Looper explicitly.
For Java
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
//do your work here
}
}, 1000);
答案9
得分: 10
使用这个
```kotlin
Looper.myLooper()?.let {
Handler(it).postDelayed({
//您的代码
}, 2500)
}
<details>
<summary>英文:</summary>
use this
```kotlin
Looper.myLooper()?.let {
Handler(it).postDelayed({
//Your Code
},2500)
}
答案10
得分: 9
使用 Executor 替代 handler 以获取更多信息 Executor。
要实现延迟发布,请使用 ScheduledExecutorService
:
ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
Runnable runnable = () -> {
public void run() {
// 做一些事情
}
};
worker.schedule(runnable, 2000, TimeUnit.MILLISECONDS);
英文:
Use Executor instead of handler for more info Executor.<br/>
To achieve post delay use ScheduledExecutorService
:
ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
Runnable runnable = () -> {
public void run() {
// Do something
}
};
worker.schedule(runnable, 2000, TimeUnit.MILLISECONDS);
答案11
得分: 7
在处理程序构造函数中提供一个循环器
Handler(Looper.getMainLooper())
英文:
Provide a looper in the Handler Constructor
Handler(Looper.getMainLooper())
答案12
得分: 7
import android.os.Looper
import android.os.Handler
inline fun delay(delay: Long, crossinline completion: () -> Unit) {
Handler(Looper.getMainLooper()).postDelayed({
completion()
}, delay)
}
Example:
delay(1000) {
view.refreshButton.visibility = View.GONE
}
英文:
import android.os.Looper
import android.os.Handler
inline fun delay(delay: Long, crossinline completion: () -> Unit) {
Handler(Looper.getMainLooper()).postDelayed({
completion()
}, delay)
}
Example:
delay(1000) {
view.refreshButton.visibility = View.GONE
}
答案13
得分: 4
如果您正在使用变量来处理Handler和Runnable,请按以下方式使用。
private Handler handler;
private Runnable runnable;
handler = new Handler(Looper.getMainLooper());
handler.postDelayed(runnable = () -> {
// 在这里执行延迟任务
handler.postDelayed(runnable, 1000);
}, delay);
此外,您需要在onDestroy()方法中移除回调。
@Override
public void onDestroy() {
super.onDestroy();
if (handler != null) {
handler.removeCallbacks(runnable);
}
}
英文:
If you are using Variable for Handler and Runnable then use it like this.
private Handler handler;
private Runnable runnable;
handler = new Handler(Looper.getMainLooper());
handler.postDelayed(runnable = () -> {
// Do delayed stuff here
handler.postDelayed(runnable, 1000);
}, delay);
Also You need to remove callbacks in onDestroy()
@Override
public void onDestroy() {
super.onDestroy();
if (handler != null) {
handler.removeCallbacks(runnable);
}
}
答案14
得分: 3
根据文档(https://developer.android.com/reference/android/os/Handler#Handler()):
在 Handler 构造过程中隐式选择 Looper 可能会导致 bug,其中操作会被静默丢失(如果 Handler 不期望新任务并退出),崩溃(如果处理程序有时在没有活动 Looper 的线程上创建),或者出现竞态条件,处理程序关联的线程不是作者预期的线程。相反,使用 Executor 或显式指定 Looper,使用 Looper#getMainLooper、{link android.view.View#getHandler} 或类似方法。如果兼容性需要隐式线程本地行为,则使用 new Handler(Looper.myLooper()) 来使读者清楚明白。
我们应该停止使用没有 Looper 的构造函数,而是应该指定一个 Looper。
英文:
According to the document (https://developer.android.com/reference/android/os/Handler#Handler()):
> Implicitly choosing a Looper during Handler construction can lead to bugs where operations are silently lost (if the Handler is not expecting new tasks and quits), crashes (if a handler is sometimes created on a thread without a Looper active), or race conditions, where the thread a handler is associated with is not what the author anticipated. Instead, use an Executor or specify the Looper explicitly, using Looper#getMainLooper, {link android.view.View#getHandler}, or similar. If the implicit thread local behavior is required for compatibility, use new Handler(Looper.myLooper()) to make it clear to readers.
We should stop using the constructor without a Looper, and specify a Looper instead.
答案15
得分: 3
**协程 Kotlin**
private val SPLASH_SCREEN_TIME_OUT_CONST: Long = 3000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
GlobalScope.launch {
delay(SPLASH_SCREEN_TIME_OUT_CONST)
goToIntro()
}
}
private fun goToIntro(){
startActivity(Intent(this, IntroActivity::class.java))
finish()
}
英文:
Coroutines Kotlin
private val SPLASH_SCREEN_TIME_OUT_CONST: Long = 3000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
GlobalScope.launch {
delay(SPLASH_SCREEN_TIME_OUT_CONST)
goToIntro()
}
}
private fun goToIntro(){
startActivity(Intent(this, IntroActivity::class.java))
finish()
}
答案16
得分: 3
以下是翻译好的内容:
这个结构在 Kotlin 中使用是一个不错的主意
companion object Run {
fun after(delay: Long, process: () -> Unit) {
Handler(Looper.getMainLooper()).postDelayed({
process()
}, delay)
}
}
之后调用方式为
Run.after(SPLASH_TIME_OUT) {
val action = SplashFragmentDirections.actionSplashFragmentToLogin()
v.findNavController().navigate(action)
}
英文:
It's a good idea use this structure in Kotlin
companion object Run {
fun after(delay: Long, process: () -> Unit) {
Handler(Looper.getMainLooper()).postDelayed({
process()
}, delay)
}
}
Later call as
Run.after(SPLASH_TIME_OUT) {
val action = SplashFragmentDirections.actionSplashFragmentToLogin()
v.findNavController().navigate(action)
}
答案17
得分: 2
Java答案
我编写了一个方便使用的方法。您可以在您的项目中直接使用这个方法。delayTimeMillis 可以设置为 2000,这意味着此代码将在 2 秒后运行。
private void runJobWithDelay(int delayTimeMillis){
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//todo: 您可以调用您想要的方法。
}
}, delayTimeMillis);
}
英文:
Java Answer
I wrote a method to use easily. You can use this method directly in your project. delayTimeMillis can be 2000, it means that this code will run after 2 seconds.
private void runJobWithDelay(int delayTimeMillis){
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//todo: you can call your method what you want.
}
}, delayTimeMillis);
}
答案18
得分: 1
这是我通常使用的代码:
代码:
Handler(Looper.myLooper() ?: return).postDelayed({
// 在这里编写你想要的代码
}, 3000)
截图:
英文:
I usually use this one
Code:
Handler(Looper.myLooper() ?: return).postDelayed({
// Code what do you want
}, 3000)
Screenshot:
答案19
得分: 0
"handler()等代码是由Android Studio 4.0.1生成的,当从头开始创建全屏活动(例如)时会生成。我知道我们被鼓励使用Kotlin,我也在使用,但我偶尔会使用示例项目来启发一些想法。
很奇怪的是,当Android Studio实际上生成了代码时,我们却受到了批评。也许逐步检查这些错误并加以修复是一个有益的学术活动,但也许Android Studio可以为我们这些爱好者生成新的干净代码…"
英文:
The handler() etc code is generated by the Android Studio 4.0.1 when a Fullscreen Activity, for example, is created from scratch. I know that we are being encouraged to use Kotlin, which I do, but from time to time I use sample projects to get an idea going.
It seems strange that we are chastised by AS when AS actually generates the code. It might be a useful academic activity to go through the errors and fix them but maybe AS could generate new clean code for us enthusiasts...
答案20
得分: 0
对于Xamarin Android,不需要更改以下部分:
Handler handler;
handler = new Handler();
只需将其修改为:
Handler handler;
handler = new Handler(Looper.MyLooper());
其余的代码保持不变。
英文:
For Xamarin Android, instead of
Handler handler;
handler = new Handler();
just write
Handler handler;
handler = new Handler(Looper.MyLooper());
the rest of the code is fine.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论