2016-04-15 12 views
1

私は1つのアプリケーションを開発しており、jsonに基づいています。私はonSuccessメソッドで受け取られる他のクラスに1つのクラスからデータを渡したいと思います。私がデータを要求すると、データは正しく受信されますが、そのデータを他のクラスにコールすると、NULLポインタエラーが発生します。 私の方法はonSuccessから他のクラスにデータを渡すには?

 @Override 
     protected Void doInBackground(Void... params1) { 

      RequestParams params; 
      params = new RequestParams(); 
      params.add("username", str_emailId); 
      params.add("password", str_password); 
      params.add("action", action); 

      String str_result=constant.login(params); 

      Log.d("Result::--",str_result); 

      return null; 
     } 

で、私のログイン方法は

public String login(RequestParams params1) { 

     client = new AsyncHttpClient(); 
     client.post(Constant.check_login_user, params1, new TextHttpResponseHandler() { 

      @Override 
      public void onSuccess(int i, Header[] headers, String response) { 

       str_result = response; 
       Log.d("Str_Result: ", str_result); 

      } 

      @Override 
      public void onFailure(int statusCode, Header[] headers, String response, Throwable e) { 
       if (statusCode == 401) { 
        jsonString[0] = response; 
        Log.d("onFailure: ", jsonString[0]); 
       } 
      } 

     }); 

     return str_result; 
    } 

である私だ成功法上のデータと、それは大丈夫ログで印刷されますが、str_result変数を返すとき、それはnullを返し、私なりdoInBackground()メソッドでログを出力すると、nullポインタエラーが返ってきます。どうすればいいでしょうか?いずれにしても、あらかじめデータを印刷する方法を教えてください。

+0

これは、非同期のhttpクライアントを使用しているためです。 onSuccessが起動する前に関数から値を返します。 –

+0

私は非同期のhttpクライアントについて詳しくは分かりませんので、onSuccess()メソッドからdoInBackground()メソッドにデータを渡す方法はありますか? – Shailesh

答えて

0

POSTメソッドは非同期関数です。簡単にするために、バックグラウンドで作業を開始すると想像してください。残りのアプリケーションは、何をしていても引き続き行います。 POSTメソッドが終了すると、POSTメソッドが成功したか失敗したかによって、onSuccess()メソッドまたはonFailure()メソッドが呼び出されます。 POSTメソッドが終了していなくても、POSTメソッドを呼び出してすぐに結果を返すことがわかります。このようなやり方であなたのログイン方法を想像することができます。 loginメソッドの実行が終了する前に

  1. 結果= nullを
  2. 呼び出しログイン()
  3. リターン結果
  4. ログインが終了したとするonSuccessを(呼び出します)

だからあなたが見る、あなたは結果を返します。

修正方法?文字列の結果を受け

クラスのような機能を実装する必要があります。 public void setResult(String result) {...}

やログインの方法は、(するonSuccessでそれを呼び出す必要があります)、このような方法:

@Override 
public void onSuccess(int i, Header[] headers, String response) { 
    // Your login method finished, now you can send result to receiving object 
    str_result = response; 
    receivingClassObject.setResult(str_result); 
} 
+0

私はあなたの言うことをしますが、スレッド内のハンドラを作成できないようなエラーを送りますLooper .preper() – Shailesh

+1

これは全く異なる問題です。 http://developer.android.com/about/start.htmlを読むことをお勧めします – Drag0

関連する問題