嗨,我想Toast在我的应用程序中随时随地使用任何线程提供给我.所以为了做到这一点,我扩展了Activity课程:
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
public class MyActivity extends Activity{
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
mHandler = new Handler();
super.onCreate(savedInstanceState);
}
private class ToastRunnable implements Runnable {
String mText;
public ToastRunnable(String text) {
mText = text;
}
public void run(){
Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show();
}
}
public void doToast(String msg) {
mHandler.post(new ToastRunnable(msg));
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的应用程序中的所有 Activity类现在都是简单的
public class AppMain extends MyActivity {
//blah
}
Run Code Online (Sandbox Code Playgroud)
我期望能够做到的(在工作线程中)是这样的:
try{ …Run Code Online (Sandbox Code Playgroud) 翻阅了react-native的官方文档和其他一些媒体资源和博客,才知道react-native中有UI线程和JavaScript线程。Javascript 线程是运行 javascript 代码的逻辑线程,进行 API 调用,处理触摸事件等等。并且 UI Thread 更新 UI。 如果 JavaScript 线程正在处理该过程,并且如果我们再次执行按钮操作或任何其他触摸事件,则需要一些时间来响应,在完成一个过程后仅 UI 更新,直到我觉得它滞后或卡在某处。
例如
有一个底部选项卡导航器,它有四个选项卡,第一个选项卡中有一个列表视图,第二个选项卡中显示多个点之间的路线的地图视图
我在第一个选项卡中执行了一些按钮操作(单击列表视图中的按钮)并立即导航到第二个选项卡,感觉更新用户界面有些滞后,或者从第一个选项卡开始导航需要一些时间(1-3 秒)标签到第二个标签
在第二个选项卡中,如果我导航到任何其他选项卡,则在此过程进行时,地图需要时间(5-10 秒)来获取多个点之间的路线,选项卡之间的导航不流畅并且存在大量 UI 延迟。
我们如何让 react-native 应用更快地响应可触摸操作并减少 UI 延迟
有没有多线程和后台线程的概念,我们可以在主线程中运行特定的逻辑并更新 UI 以使本机应用程序响应更快而没有任何延迟。
我有一个绑定服务,负责下载文件,因此它知道下载状态/进度.UI(片段或活动)必须显示/更新服务的下载进度.
实际上我认为常用的方法是使用BroadcastReciever或CallBack来自Activity.但我听说过使用RxJava(ReactiveX编程)和中介类(以及Dagger将其注入服务和活动),如下所述.
所以我的问题是如何使用这些东西来处理RxJava?任何代码示例?有没有比使用意图更有效的方法?
资源: 从Service更新UI的有效方式比意图更新?[见第一个答案更新]
我有一个课程,通过PRISMs事件聚合器订阅一个事件.
由于这里提到的模拟事件聚合器有点困难,我只是实例化一个真实聚合器并将其传递给被测系统.
在我的测试中,我然后通过该聚合器发布事件,然后检查我的测试系统如何对它做出反应.由于事件将在生产期间由FileSystemWatcher引发,我想通过订阅UIThread来使用自动分派,因此我可以在引发事件后更新我的UI.
问题是,在测试期间,除非我没有订阅UIThread,否则事件永远不会在被测系统中被注意到.
我正在使用MSpec进行测试,我通过TDD.Net从VS2008内部运行.添加[RequiresSta]到我的测试类没有帮助
有没有人有一个解决方案,这使我免于在测试期间更改ThreadOption(例如通过属性 - 这是一个丑陋的黑客)???
为了参数起见,将UI线程视为一个线程,该线程已调用Application.Run()或调用其中一个重载,并且有一个活动的消息循环正在运行.
有没有办法检测我们当前是否正在这样的线程上执行?
我想要这个的原因是因为我有一个具有长期运行的私有函数的类.该类本身已经是多线程的,并且该类的使用使得它可以从UI或后台线程进行处理.这个功能也属于这个网络.但我不希望它阻止UI线程.所以我想检测我是否在UI线程上运行,如果是这样,将函数调用转换为后台线程(可能ThreadPool,但这对于此讨论来说不是问题).这完全表现良好,但后台线程可能依赖于函数的输出,因此阻塞它们更好,而UI线程以更"一劳永逸"的方式访问它.
我正在写小应用程序,现在我发现了一个问题.我需要调用一个(稍后可能是两个)方法(此方法加载一些东西并返回结果)而不会滞后于app的窗口.
我发现类,如Executor或Callable,但我不知道如何与那些工作.
你可以发布任何解决方案,这对我有帮助吗?
谢谢你的所有建议.
编辑:方法必须返回结果.此结果取决于参数.像这样的东西:
public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
return webClient.getPage(page);
}
Run Code Online (Sandbox Code Playgroud)
此方法大约需要8-10秒.执行此方法后,可以停止线程.但我需要每2分钟调用一次方法.
编辑:我用这个编辑了代码:
public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
Thread thread = new Thread() {
public void run() {
try {
loadedPage = webClient.getPage(page);
} catch (FailingHttpStatusCodeException | IOException e) {
e.printStackTrace();
}
}
};
thread.start();
try {
return loadedPage;
} catch (Exception e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我再次收到错误(即使我 …
Qt医生说,
如上所述,每个程序在启动时都有一个线程.该线程称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在此线程中运行.
Android文档说,
与活动和其他组件一样,服务在应用程序进程的主线程中运行
和iOS,
强烈建议不要从后台线程(例如计时器,通信等)更新UI控件等.这可能是崩溃的原因,有时很难识别.而是使用这些来强制在UI线程上执行代码(它始终是"主"线程).
为什么他们使用单线程模型来更新UI?
我正在尝试调用API,当我的变量准备就绪时,分别更新UI组件.
这是我的网络单身人士正在启动协程:
object MapNetwork {
fun getRoute(request: RoutesRequest,
success: ((response: RoutesResponse) -> Unit)?,
fail: ((throwable: Throwable) -> Unit)? = null) {
val call = ApiClient.getInterface().getRoute(request.getURL())
GlobalScope.launch(Dispatchers.Default, CoroutineStart.DEFAULT, null, {
try {
success?.invoke(call.await())
} catch (t: Throwable) {
fail?.invoke(t)
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所说的:
network.getRoute(request,
success = {
// Make Some UI updates
},
fail = {
// handle the exception
})
Run Code Online (Sandbox Code Playgroud)
我得到的异常表示无法从UI线程以外的任何线程更新UI:
com.google.maps.api.android.lib6.common.apiexception.c: Not on the main thread
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个解决方案,但是从Kotlin 1.3开始resume,Continuation<T>课堂上已经"弃用"了
我目前正在尝试编写一个组件,其中某些部分应该在UI线程上运行(解释会很长).所以最简单的方法是将控件传递给它,并在其上使用InvokeRequired/Invoke.但我不认为将控件引用传递给"数据/背景"组件是一个好设计,所以我正在寻找一种在UI线程上运行代码的方法,而无需提供控件.像WPF中的Application.Dispatcher.Invoke ...
任何想法,马丁
我在我的应用程序中运行了一个服务..
此服务有一个用于向服务器发送消息的对象以及一个获取该对象并使用它的函数.
该对象是从服务初始化的,但是当UI获取此对象并使用它时 - 看起来它在UI线程上使用它.
它是否正确 ?有没有办法让我的对象始终从服务线程运行?
public class ServerMessagesManager extends Service {
private ServerMessagesReceiver serverMessageReceiver;
@Override
public void onCreate() {
super.onCreate();
this.serverMessageReceiver = new ServerMessagesReceiver(app);
}
public ServerMessagesReceiver getServerMessagesReceiver()
{
return serverMessageReceiver;
}
}
Run Code Online (Sandbox Code Playgroud)