背景:我正在尝试转换一个Java(非GUI)程序来运行在Android上。为了简单起见,假设这个程序有以下文件:
java,sinfer.java,main.java
public class MainActivity extends Activity {
/* UI Elements */
private TextView output;
/* Thread Handler */
private Handler uiHandler;
/* Handle message override */
public class UIHandler extends Handler {
@Override
public void handleMessage(Message msg) {
output.append(msg.obj.toString());
super.handleMessage(msg);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_run_fsi);
output = (TextView) findViewById(R.id.displayTextView);
uiHandler = new UIHandler();
setStartButtonClickListener();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_run_fsi, menu);
return true;
}
private void setStartButtonClickListener() {
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runFSI();
}
});
}
private void runFSI() {
// initialize SInfer and pass uiHandler
SInfer inferer = SInfer.getInstance(/*other variables*/, uiHandler);
// initialize DSGen
DSGenerator dsGen;
Thread t1 = new Thread(dsGen);
Thread t2 = new Thread(inferer);
t1.start();
t1.yield();
t2.start();
t2.yield();
try {
Thread.sleep(10000);
} catch (Exception e) {
}
inferer.stop();
dsGen.stop();
}
}
SInfer内部定义的run方法如下(System.out代码是从原始Java代码中遗留下来的)
@Override
public void run() {
// System.out.println("Inference: Thread started...");
while (stopFlag == false) {
try {
// System.out.println("SInference: run.........");
Thread.sleep(200);
inferenceResult = doInference();
/* Send result to UI thread */
Message msg = Message.obtain(uiHandler);
msg.obj = inferenceResult.toString();
uiHandler.sendMessage(msg);
} catch (InterruptedException e) {
// System.out.println(e.getMessage());
}
}
}
您正在运行Thread.Sleep(10000);在主线程中(OnClick在UI线程中调用),所以在这10秒内UI中什么都不能更新。尝试在单独的线程中调用runFSI方法。
我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇
问题内容: 我刚刚开始进行android开发,并且更新UI确实使我很烦:/ 到目前为止,这是我一直在努力的工作- 它工作正常,但是每个人都说要在主线程中做图形,所以我正在尝试(但失败)将其传递给另一个线程。麻烦的是,我真的不知道怎么做,因为我从未真正使用过线程。 Google给出的有关使用Threads的示例似乎并不十分清楚,我也无法真正按照自己的意愿去做。我可以请某人在这里给我一个最基本的例子,
问题内容: 我对android完全陌生,只想知道它是否是在主线程外更新UI的任何可行且可行的方法。仅从我的代码中,我就在下面列出了这些代码;根本不可能。但是, 我只想使用另一个线程来更新UI 。请事先帮助我! 问题答案: 使用activity.runOnUiThread
问题内容: 我想更改Android中的UI。 我的主类创建第二个类,然后第二个类调用主类的方法。主类中的方法应更新UI,但程序在运行时会崩溃。 我该怎么办? 我的主要班级: 还有我的第二堂课: 问题答案: 您不能从主线程以外的线程调用UI方法。您应该使用Activity#runOnUiThread()方法。
问题内容: 据我所知,在android中,当我们运行进程时,它们始于Main线程。当我们做一些繁重的工作时,我们使用了一个新线程。如果我们想修改UI外观,可以使用在UI上运行。 有人可以向我解释这些线程的作用以及如何使用它们吗? 问题答案: UI线程和主线程只是同一线程的不同名称。 应用程序的所有UI膨胀都在此主线程上完成。之所以将“较重”的工作委派给其他线程,是因为我们不希望这些操作减慢UI的响
我正在尝试动态更新主线程中的一个android。 不幸的是,我很难从网上的教程中找到任何东西。它们似乎都没有提供线程之间如何通信的完整图片。 我希望避免匿名类,只要有新消息,就动态创建新的。
问题内容: 我想在后台线程中运行一些Runnable。我想使用Handler,因为它便于延迟。我的意思是 凡 可运行 应当运行 后台 线程。是否可以创建这样的处理程序?是否在某个地方有“背景” Looper,或者该如何创建? PS我知道如何使用自定义类扩展Thread,但是比处理程序方式需要更多的编码工作。因此,请不要发布其他解决方案或类似的内容 如果Handler能以“干净”的方式做到这一点,我
我想在后台线程中运行一些Runnable。我想使用Handler,因为它方便延迟。我的意思是 runnable应该在后台线程中运行。有可能创造这样的处理器吗?某个地方有没有“背景”Looper或者我怎么才能创建它? 附言:我知道如何使用自定义类扩展Thread来做到这一点,但它需要更多的编码工作,而不是以处理程序的方式进行。因此,请不要发布其他解决方案或类似内容 我只是想知道汉德勒是否能以“干净”