2016-03-19 7 views
0

私はAndroidアプリケーションで作業しています。今、私はログインシステムのいくつかのメソッドを書いています。サーバーの応答に従ってtrueまたはfalseを返すbooleanメソッドを作成しようとしています。ブールメソッドは何も返すことができません

public static boolean login(final String name, final String password) { 

    final boolean result; 
    Thread nt = new Thread() { 
     @Override 
     public void run() { 


      URL url; 
      HashMap<String, String> postDataParams = new HashMap<String, String>(); 

      postDataParams.put("name", name); 
      postDataParams.put("password", password); 

      try { 

       url = new URL(""); 

       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       conn.setReadTimeout(15000); 
       conn.setConnectTimeout(15000); 
       conn.setRequestMethod("POST"); 
       conn.setDoInput(true); 
       conn.setDoOutput(true); 


       OutputStream os = conn.getOutputStream(); 
       BufferedWriter writer = new BufferedWriter(
         new OutputStreamWriter(os, "UTF-8")); 

       writer.flush(); 
       writer.close(); 
       os.close(); 
       int responseCode = conn.getResponseCode(); 

       if (responseCode == HttpsURLConnection.HTTP_OK) { 
        return true; 
       } else { 
        return false; 
       } 

      } catch (Exception e) { 
       return false; 
       e.printStackTrace(); 
      } 
     } 

    }; 
    nt.start(); 
} 

問題がcannot return a value from a method with void result type、何かが私は理解できないので、それが明確にbooleanメソッドとして定義されているため、すべてのreturn文は、強調表示されることをである:これは私のコードです。私は作成した新しいスレッドとは何かが関係していると思うが、このアプリケーションはAndroidデバイス上で実行されるので、別のスレッドでクエリを実行する必要がある。

ありがとうございます!

+0

スレッドが終了するのを待つことができますし、スレッドからローカル変数を関数 'boolean login'に変更し、関数がwait文を渡した後に戻ります – HDJEMAI

答えて

3

コードのすべてがで、voidを返します。コードはすべてpublic void run()メソッド内にあります。 したがって、booleanを返すことはできません。

+0

うわー、私は考慮しませんでしたその詳細。そのような間違い。どうすれば修正できますか? – pitazzo

+0

実行中のブール値の結果変数を(まだログイン内に)作成し、実行中に "return true/false"を呼び出すのではなく、result = true/falseを呼び出してから、あとでvoid returnを実行します。実行が終了した後、結果変数をログインの戻り値として返します。もしそうなら、この情報で答えを出します。 – Chexxor

+0

@pitazzo私は最新の問題を個別の回答で取り上げました – Chexxor

0

これはすべて範囲についてです。新しいスレッドを開始してから、スレッドスコープの内部から値を戻すことはできません。 Threadクラス内のrun()メソッドには、void戻り型があります。

スレッドを削除してからコードを直接メソッドに配置する必要があります。しかし、アンドロイドであるため、メインスレッドでの接続は許可されないため、コールバックインターフェイスを作成し、サイトがスレッド内でロードされたら、インターフェイス内のメソッドをtrueまたはfalseの結果で呼び出します。

0

他の人が指摘しているように、コンパイルエラーの原因は、匿名Runnableインスタンスのrun()メソッドの値を返そうとしていることです。 run()メソッドはvoidメソッドです。

コメントでは、あなたのloginメソッドが結果を返すことができるように "修正する"方法を尋ねました。

単純な答えは、スレッドとrun()メソッドを取り除き、loginメソッドで直接作業することです。例えば

public static boolean login(final String name, final String password) { 
    try { 
     URL url = new URL("some url"); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(15000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("POST"); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 

     OutputStream os = conn.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(
       new OutputStreamWriter(os, "UTF-8")); 
     // write the post data ... 
     writer.flush(); 
     writer.close(); 
     os.close(); 
     int responseCode = conn.getResponseCode(); 
     return (responseCode == HttpsURLConnection.HTTP_OK); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

loginが値を返す必要がある場合、その値は、いつメソッドが戻る利用可能である必要があります。それは同期的です。 (別の)スレッドで作業を行う場合、現在のスレッドは、1)その他のスレッドが終了するのを待って、2)そのスレッドから結果を取得する必要があります。あなたはそれをすることができますが、無意味です。

loginが呼び出されたときに現在のスレッドをブロックしないようにするには、loginメソッドをFutureなどのように戻す必要があります。しかし最終的には、ログインの成功/失敗ステータスを使用するコードはFuture.getを呼び出す必要があります。それは結果を待つ必要があり、したがってスレッドをブロックする必要があります。

最高の答えは、あなたのUIの状態マシンを再設計することです。

関連する問題