1

MainAcitivityメソッドによって取得されたユーザー名とパスワードを使用してアプリケーションにログを記録するために、内部に次のコードがありますjsnrqstr.sendRequest(username, password, URL);

loginButton.setOnClickListener(
        new View.OnClickListener()
        {
            public void onClick(View view)
            {
                username = userNameBox.getText().toString();
                password = passwordBox.getText().toString();
                login_state = jsnrqstr.sendRequest(username, password, URL);
                if(login_state.equals("ok")){
                    details.setUserName(username);
                    details.setPassword(password);
                    Toast.makeText(MainActivity.this, "User Verified", Toast.LENGTH_LONG).show();
                    passwordBox.setText("");
                    Intent myIntent = new Intent(MainActivity.this, DashBoardActivity.class);
                    MainActivity.this.startActivity(myIntent);
                }else
                    Toast.makeText(MainActivity.this, "Login Unsuccessful", Toast.LENGTH_LONG).show();
                    passwordBox.setText("");
            }
        });

このメソッドは、次のコードを使用して、JSON オブジェクトで応答する erlang サーバーからの応答を受信し、そこから login_state を受信できました。コードjsnrqstr.sendRequest(username, password, URL);

public class JSONRequester {

String state;

public String sendRequest(final String userName, final String password, final String URL){

    new Thread(new Runnable() {
        public void run() {
            HttpClient client = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
            HttpResponse response;
            JSONObject json = new JSONObject();
            try{
                HttpPost post = new HttpPost(URL);
                post.setHeader("Content-type", "application/json");
                json.put("username", userName);
                json.put("password", password);
                StringEntity se = new StringEntity( json.toString());
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);
                /*Checking response */
                if(response!=null){
                    String temp = EntityUtils.toString(response.getEntity()); //Get the data in the entity
                    //Log.v("response", temp);
                    JsonObject o = new JsonParser().parse(temp).getAsJsonObject();
                    Log.v("response", o.get("state").toString());
                    state = o.get("state").toString();
            }}
            catch(Exception e){
                e.printStackTrace();
                //createDialog("Error", "Cannot Estabilish Connection");
            }
        }
      }).start();
          return state;
}

しかし、次のNull-pointer Exception @が発生します

if(login_state.equals("ok")){

login_stateこれは、上記のメソッドから値を正しく返していないことを意味します。私が思うに、これは、新しい実行可能なスレッドが値を返すまでには遅すぎるためです。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

1

戻り値に依存している場合は、スレッドの完了時にコードの実行を開始する、ある種のコールバックを使用する必要があります。または、新しいスレッドを起動して、スレッドが戻るのを待ってから他のことを行うこともできます。

于 2012-09-21T06:41:37.840 に答える
1

問題は行の間にあります:)-これら2つ:

})。始める();

<== ここで!!!

  return state;

2 つ目は、スレッドがまだ実行されている間に、時期尚早に実行されます。同時実行が解決策です。

一般的な Android 固有のパターンの 1 つは AsyncTask - http://developer.android.com/reference/android/os/AsyncTask.html - またはその類似物 (Thread/Handler など)です。

クリックすると、onPreExecute (sendRequest の前のコード) でプロセスが開始されます。たとえば、進行状況ダイアログが表示され、初期化が行われます。スレッドのコードは doInBackground メソッドに入り、状態変数を設定します。完了したら、onPostExecute で進行状況ダイアログを閉じ、ログイン ロジックに進みますif(/*response*/ state!=null)

于 2012-09-21T08:26:35.653 に答える