Đoạn đơn giản của mã midlet (lớp Moo) dưới đây (sau khi trích đoạn) deadlocks (Ít nhất tôi giả định nó deadlocks sau khi đọc bài này trên chủ đề here).j2me mạng, chủ đề và deadlocks
tôi đã sao chép các trích đoạn có liên quan từ bài:
String url = ...
Connection conn = null;
try {
conn = Connector.open(url);
// do something here
}
catch(IOException e){
// error
}
Gốc của vấn đề là việc ngăn chặn chất của() gọi mở. Trên một số nền tảng, hệ thống thực hiện kết nối thực tế dưới các nắp, trên cùng một chuỗi riêng biệt. Chặn chuỗi cuộc gọi cho đến khi chuỗi kết nối tạo kết nối. Đồng thời, hệ thống phụ bảo mật có thể yêu cầu người dùng xác nhận kết nối và chuỗi chỉ kết nối cho đến khi chuỗi sự kiện được xác nhận từ người dùng. Lỗi bế tắc xảy ra vì chuỗi sự kiện đã đợi chuỗi kết nối.
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("http://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();
}
}
}
}
Ai đó có thể xin vui lòng cho tôi biết thế nào gọi hệ thống thread được thực hiện ở đây (sự kiện và thông báo chủ đề) và chuỗi các sự kiện dẫn đến sự bế tắc. Tôi không rõ ràng những gì là các chủ đề liên quan ở đây dẫn đến bế tắc.
- Có tài liệu nào về mô hình chuỗi j2me không?
- Tôi có thể lấy nguồn cho các lớp hệ thống j2me ở đâu (Tôi muốn kiểm tra việc triển khai các lớp Kết nối)?
EDIT: Trong đoạn mã trên, tôi nhận được logic. Nhưng mã dưới đây ít nhất phải hoạt động đúng không? Điều này cũng deadlocks nơi tôi đang làm kết nối mạng trong một chủ đề riêng biệt.
public class Foo extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
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());
FetchImage fetchImage = new FetchImage();
Thread thread = new Thread(fetchImage);
thread.start();
thread.join();
bgImage.getGraphics().drawImage(fetchImage.image, 0, 0, 0);
graphics.drawImage(bgImage, 0, 0, 0);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class FetchImage implements Runnable {
public Image image;
public void run() {
HttpConnection httpConnection;
try {
httpConnection = (HttpConnection) Connector
.open("http://10.4.71.200/stage/images/front/car.png");
image = Image.createImage(httpConnection.openInputStream());
httpConnection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Câu hỏi và trả lời tuyệt vời, đặc biệt nếu bạn thực sự muốn một số rõ ràng với điều này luồng. – Sydwell