8

現在私のプロジェクトでは、Http リクエストを作成しており、異なる http 応答を異なるコールバック メソッドに送信したいと考えています。

私がやりたいことを示すために、以下に簡単なサンプルを書きました。私はそれがおそらく私が望む方法で可能ではないことを知っていますが、同じことを達成するためのクリーンなソリューションはありますか?

サンプル:

活動クラス:

public class Main extends Activity{  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Services service = new Services();
        service.login("user", "password", **onLoginComplete()** );
    }

    public void onLoginComplete(String HTTPResponse){
        // Do something with the response
    }
}

サービス クラス:

public class Services{  

    public void login(String user, String password, CALLBACK){
        Request request = createLoginRequest(user, password);
        sendRequest(request, CALLBACK);
    }

    public class sendRequest extends AsyncTask{
        @Override
        protected Object doInBackground(Object... params) {
             // Do Http Request
             // Get Response
             CALLBACK(response);
        } 
    }
}
4

5 に答える 5

21
interface OnLoginCompleteListener {
    void onLoginComplete(String response);
}

その後

public void login(String user, String password, OnLoginComplete listener) {
    mOnCompleteListener = listener;
}

protected Object doInBackground(Object... params) {
    mOnCompleteListener.onLoginComplete(response);
}

そして最後に

service.login("user", "password", new OnLoginCompleteListener() {
    public void onLoginComplete(String response) {
        // Handle your response
    }
});
于 2012-09-13T23:14:28.217 に答える
2

私があなたを正しく理解していれば、あなたが達成しようとしていることは、AsyncTask を使用して行うことをお勧めします。ここで非常に簡単な方法で説明されています http://developer.android.com/reference/android/os/AsyncTask.html

さらに、サイトへの GET リクエストを実行する (doInBackground) 方法と、その結果を読み取る (onPostExecute) 方法の例を共有します...お役に立てば幸いです!

protected InputStream doInBackground(String... example) {
    JsonComm jc = new JsonComm();
    String baseUrl = "http://www.somewhere.com/get_request.php?data=";
    String jcString = jc.encodeJSON("nowyou","seeme");
    String url = "";

    try {
        url = baseUrl + URLEncoder.encode(jcString, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    HttpResponse response;
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    try {
        request.setHeader("Accept", "application/json");
        request.setHeader("Content-type", "application/json");
        response = httpClient.execute(request);
    } catch (Exception ex) {
        // handle exception here
    }finally {
        httpClient.getConnectionManager().shutdown();
    }
    return response.getEntity().getContent();
}

protected void onPostExecute(InputStream is) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
     System.out.println(sb.toString());

}
于 2013-10-09T00:33:26.730 に答える
0

これを処理するにはいくつかの方法があります。コールバックに を渡すRunnableか、クラスでオーバーライドするメソッドを提供して、メイン アクティビティServicesから派生した匿名クラスを使用することができます。パラメーターを渡す必要がある場合は、応答パラメーターを使用してメソッドを定義できる場所とServices同等のもののインターフェイスを定義することもできます。Runnable

于 2012-09-13T23:14:58.810 に答える
0

Java でコールバックを実装する方法:

public interface SomeCallbackInterface {
    public void finished(Request req);
}

次に、クラスで次のことを行います。

YourReqeust.instantiateWithCallback(new SomeCallbackInterface() {
   @Override
   public void finished(Request req){
      // do something here
   }
});

これは、あなたがどんなものでも行うこととほとんど同じですView.OnClickListener

于 2012-09-13T23:16:16.933 に答える