This week's book giveaway is in the Servlets forum.
We're giving away four copies of Murach's Java Servlets and JSP and have Joel Murach on-line!
See this thread for details.
The moose likes Java Micro Edition and the fly likes Help: Potential deadlock in commandAction() ? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Murach's Java Servlets and JSP this week in the Servlets forum!
JavaRanch » Java Forums » Mobile » Java Micro Edition
Bookmark "Help: Potential deadlock in commandAction() ?" Watch "Help: Potential deadlock in commandAction() ?" New topic
Author

Help: Potential deadlock in commandAction() ?

Chua Wen Ching
Greenhorn

Joined: Sep 28, 2003
Posts: 3
Hi there.
I got this error from ktoolbar:
Project "SecondTest" loaded
Project settings saved
Building "SecondTest"
Build complete
Running with storage root DefaultColorPhone
Warning: To avoid potential deadlock, operations that may block, such as
networking, should be performed in a different thread than the
commandAction() handler.
Below is my source codes:
RequestServlet.java
==============
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* Example servlet showing request headers
*/
public class RequestServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
BufferedReader br = request.getReader();
String buf = br.readLine();
out.print("Rec: "+buf);
}
}
SecondMidletServlet.java
===================
import javax.microedition.rms.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import java.io.*;
import java.util.Vector;
public class SecondMidletServlet extends MIDlet implements CommandListener {
Display display = null;
List menu = null;
TextBox input = null;
String user = null;
String url = "http://developer.java.sun.com/servlet/RequestServlet";
static final Command backCommand = new Command("Back", Command.BACK, 0);
static final Command submitCommand = new Command("Submit", Command.OK, 2);
static final Command exitCommand = new Command("Exit", Command.STOP, 3);
String currentMenu = null;
public SecondMidletServlet() {
}
public void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
menu = new List("Invoke Servlet", Choice.IMPLICIT);
menu.append("Add a user", null);
menu.addCommand(exitCommand);
menu.setCommandListener(this);
mainMenu();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
void mainMenu() {
display.setCurrent(menu);
}
public void addName() {
input = new TextBox("Enter first name:", "", 5, TextField.ANY);
input.addCommand(submitCommand);
input.addCommand(backCommand);
input.setCommandListener(this);
input.setString("");
display.setCurrent(input);
}
void invokeServlet(String url) throws IOException {
HttpConnection c = null;
InputStream is = null;
OutputStream os = null;
StringBuffer b = new StringBuffer();
TextBox t = null;
try {
c = (HttpConnection)Connector.open(url);
c.setRequestMethod(HttpConnection.POST);
c.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
c.setRequestProperty("User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0");
c.setRequestProperty("Content-Language", "en-CA");
os = c.openOutputStream();
String str = "name="+user;
byte postmsg[] = str.getBytes();
System.out.println("Length: "+str.getBytes());
for(int i=0;i<postmsg.length;i++) {
os.write(postmsg[i]);
}
// or you can easily do:
// os.write(("name="+user).getBytes());
os.flush();
is = c.openDataInputStream();
int ch;
while ((ch = is.read()) != -1) {
b.append((char) ch);
System.out.print((char)ch);
}
t = new TextBox("Second Servlet", b.toString(), 1024, 0);
t.addCommand(backCommand);
t.setCommandListener(this);
} finally {
if(is!= null) {
is.close();
}
if(os != null) {
os.close();
}
if(c != null) {
c.close();
}
}
display.setCurrent(t);
}
public void commandAction(Command c, Displayable d) {
String label = c.getLabel();
if (label.equals("Exit")) {
destroyApp(true);
} else if (label.equals("Back")) {
mainMenu();
} else if (label.equals("Submit")) {
user = input.getString();
try {
invokeServlet(url);
}catch(IOException e) {}
} else {
addName();
}
}
}
Any idea how to solve this? I am a newbie and that source code is extracted from a tutorial in java sun.
Please!
Thanks.
Regards,
Chua Wen Ching
James Reilly
wrangler
Ranch Hand

Joined: Oct 01, 2003
Posts: 30
Normally you try to do networking in a seperate thread,
and not for example inside the body of a method like
commandAction. This is because the networking may block.
(By avoiding (possibly) blocking in the UI thread, you
also help to keep the MIDlet's user interface alive and
responsive for the end-user.)
You might try looking at an example of a multithreaded
MIDP networking. (For example, Jonathan Knudsen's http://wireless.java.sun.com/midp/articles/threading/ is one such example.)
Hope this helps
[ October 01, 2003: Message edited by: james reilly ]
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Help: Potential deadlock in commandAction() ?
 
Similar Threads
Deadlock Problem - Please Help
servlet -> midlet null problem
Midlet & Servlet(Tomcat) Connection Problem
the problem abt communication between serlvet & midlet
Midlet & Servlet(Tomcat) Connection Problem