1

サーバー上のデータベースと対話する j2me アプリケーションを作成しています。したがって、スレッドを起動してサーバーに接続します。を実装する別のクラスですべてのコマンド アクションを処理しますCommandListener

サーバーから返された応答を取得しようとすると、空の文字列が返されます。サーバーに接続するスレッドが戻るのを待ってみましたが、これによりアプリケーションが応答しなくなります。

以下は私が使用しているコードです。

//my network worker class.
public class NetworkConnector implements Runnable {
    //constructor
    public NetworkConnector(String url){
       //url =>server url to connect to.
       Thread thread = new Thread(this);
       thread.start();
    }

    private String serverReply="";
    private String url="

    //method to connect to the server and return the 
    //response from the server.
    public String sendData(String serverUrl) {

      //open streams to connect to the Server.
      httpConn = (HttpConnection)  
      Connector.open(serverUrl,Connector.READ_WRITE, true);
      httpConn.setRequestMethod(HttpConnection.GET);

      inStream = httpConn.openInputStream();
      int read;
      while ((read = inStream.read()) != -1) {
        sb.append((char) read);
      }

      return sb.toString();
   }


   public String getServerReply() {
     //serverReply is a class variable.
     return serverReply;
   }

   public void run(){
      //call the send method that connects to the server.
       serverResponse = sendData(Url);
   }

} //end of connector class.

// this class is where all my Command Actions are
//implemented. 
public class CommandActionController implements
CommandListener, DataReceiver {

public void commandAction(Command cmd, Displayable d) {
   //networkMgr => is the worker class that makes
   //connection to the server.
   networkMgr = new NetworkConnector("http://localhost
   /JsonPhp/login.php?uname=" + loginUserInfo.userName +
   "&passwd=" + loginUserInfo.password);

   //here am getting the response from the server.
   String serverResponse = networkMgr.getServerReply();

   //at this point the ServerReponse String is Empty =>
   //yet the server is supposed to return some String.
   System.out.println("xxxxxxxxxxxxxxxxxx
   ServerResponse =" + serverResponse);
   }

   }//end of CommandListener class.
4

3 に答える 3

3

価値についてのあなたの期待serverResponseは間違っています。commandAction質問のコード スニペットを使用して取得しようとすると、空になる可能性があります。

空でない値を取得するには、NetworkConnector.getServerReply()スレッドが終了してサーバーの応答が実際に取得されるまで適切に待機するようにメソッドを再設計する必要があります。

ただし、それを行うと、CommandActionControllerユーザー インターフェイスの応答性を維持するために再設計する必要があります。 「サーバーに接続するスレッドを待機する」というテストで、まさにそれが示されました。

再設計されたコードは、サーバー接続スレッドを起動し、commandActionできるだけ早く終了する必要があります (ユーザーが何が起こるかを確認できるように、「待機画面」に変更する可能性があります)。次の画面の更新は、サーバーの応答が得られた後にのみトリガーする必要があります。

この種のアプリケーションを適切に設計する方法を説明することを特に対象としたチュートリアルを検討することを検討してください - Networking, User Experience, and Threads :

この記事では、MIDlet がユーザー インターフェイスを損なうことなくネットワーク接続を確立する方法について説明します。これには、マルチスレッド ネットワークと待機画面の使用を示す 6 つの反復的な例が含まれています...

于 2012-10-22T07:53:34.663 に答える
0

java.util.concurrent なしで行う方法は次のとおりです。

Result handleRequest(){
    final String url = // get url
    Work work = new Work(url):
    Thread t = new Thread(work);
    t.start();
    // do other stuff
    if(t.isAlive()){
        // still running
    }
    // this waits until the work is done
    // and it will be safe to access work.result after
    // this call has returned.
    t.join(); 
    return work.result;
}

その後

class Work implements Runnable{
    final String url;
    Result result;
    public void run(){
        this.result = // do your network stuff
    }
}
于 2012-10-22T12:58:22.617 に答える
-2

コンストラクターでスレッドを開始しないでください。また、runnable はスレッドに渡されることを意図しています。これを行う最も簡単な (そして「適切な」) 方法は次のとおりです。

  1. Callableの代わりに を実装しRunnableます。
  2. a のExecutorService代わりに a を使用するThread
  3. Futureオブジェクトを使用して非同期に処理を行う/ユーザーに応答する

簡単な例を次に示します。

class Stuff {
    final ExecutorService exec = 
                 Executors.newCachedExecutorService(// please see doc);
    Result process(String url){
        Future<Result> future = exec.submit(new Work(url));
        // do some other stuff
        if(future.isDone()){
            // return result?
        }
        return future.get(); // this call will wait until result is available
    }
} 

その後

class Work implements Callable<Result> {
    final String url;
    Result call() throws Exception {
        // do your network stuff here
        return result;
    }
}

詳細についてはjava.util.concurrent.ExecutorService.submit()java.util.concurrent.Futureおよびのドキュメントを参照java.util.concurrent.Callableしてください。

于 2012-10-22T10:50:39.413 に答える