我在很多地方都读过j2me应用程序中的网络连接应该在一个单独的线程中完成。这是必需品还是好事?
我问这个是因为我无法在任何地方找到这个必须在一个单独的线程中完成的内容。此外,当我写一个简单的应用程序通过网络获取图像并将其显示在屏幕上(不使用线程)时,它无法正常工作。当我改变它以使用单独的线程时,它工作。我不确定它是否有效只是因为我将其更改为单独的线程,因为我还对代码进行了许多其他更改。
有人可以确认一下吗?
修改 如果在单独的线程中运行不是必需的,有人可以告诉我为什么以下简单的代码不起作用?
它来到一个模拟器问“可以连接到网络”的阶段。无论我是按“是”还是“否”,屏幕都不会改变。
public class Moo extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
Display display = Display.getDisplay(this);
MyCanvas myCanvas = new MyCanvas();
display.setCurrent(myCanvas);
myCanvas.repaint();
}
class MyCanvas extends Canvas {
protected void paint(Graphics graphics) {
try {
Image bgImage = Image.createImage(getWidth(), getHeight());
HttpConnection httpConnection = (HttpConnection) Connector
.open("https://stackoverflow.com/content/img/so/logo.png");
Image image = Image.createImage(httpConnection
.openInputStream());
bgImage.getGraphics().drawImage(image, 0, 0, 0);
httpConnection.close();
graphics.drawImage(bgImage, 0, 0, 0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
修改:我得到了代码here的答案。
修改:我产生了一个关于here的单独问题。
答案 0 :(得分:2)
问题是您正在尝试在负责运行UI的线程中工作。如果您不使用单独的线程,那么在您执行工作时该UI线程正在等待,并且无法处理您的任何其他UI更新!所以是的,你真的不应该在事件处理程序中做任何重要的工作,因为你需要在那里快速返回控制。
答案 1 :(得分:0)
我同意肖恩的观点,但不需要将您的网络连接放在单独的线程中,这只是最佳实践。我认为将连接移动到单独的线程后,连接正常工作可能是巧合。无论哪种方式,如果您想在连接发生时向用户提供任何视觉反馈(您可能考虑到用户可以在移动网络上遇到的延迟差异),您应该在单独的线程中进行联网处理
答案 2 :(得分:0)
您不必在新线程中进行网络连接,但实际上您会发现这样做几乎总是一个好主意,因为网络活动可能会阻止您的应用程序处于无响应状态。
这是一个old article,但它谈到了网络和用户体验中涉及的一些问题。