###前提・実現したいこと
AndroidからサーバーにPOST通信非同期でアクセスし、文字情報を受け取りたいのです。
エラーメッセージ This Handler class should be static or leaks might occur(null)
###該当のソースコード
java```ここに言語を入力
ここにご自身が実行したソースコードを書いてください
public void http_post(String sURL,String WebID,String Dbw_s,String Dbw_e,String postStr){//非同期用 // // 文字列を送信し、文字列を受信する。(POST 非同期) retStr ="";// Http.Request request = new Http.Request();// request.url = sURL;//String sURL ="http://akb5.val.jp/send.php"; request.params.add(new Http.Param(Http.Param.TYPE_STRING, "webid", WebID));// request.params.add(new Http.Param(Http.Param.TYPE_STRING, "dbw_s", Dbw_s)); request.params.add(new Http.Param(Http.Param.TYPE_STRING, "dbw_e", Dbw_e)); request.params.add(new Http.Param(Http.Param.TYPE_STRING, "poststr", postStr)); @Override public void onFinish(Http.Response response) { //public String onFinish(Http.Response response) { // HTTPステータスコードが200 SharedPreferences pref = getApplicationContext().getSharedPreferences( "PrefereDAT", Context.MODE_PRIVATE ); ReqfromAnywhere=pref.getInt( "ReqfromAnywhere", 0 );//第二引数は、もしそのキーの値が存在しないときの初期値とする値を指定します。 if (response.code == 200) { // 受信した文字列を取得 retStr = (String) response.value; if(ReqfromAnywhere==0){ staticMethod(retStr);//返信DATAをDATAを仕分け }else{ staticMethod1();//1=別処理へ } } } }); } private static void staticMethod() { } private static void staticMethod1() { } //Handlerを使っているところを追記 public class Http { /** * リクエスト情報クラス */ public static class Request { // リクエストURL public String url = null; // POSTパラメータ public List<Param> params = new ArrayList<Param>(); // 保持オブジェクト public Object keepObject = null; } /** * レスポンス情報クラス */ public static class Response implements Serializable { private static final long serialVersionUID = 1L; // HTTPレスポンスコード public Integer code = null; // レスポンス内容 public Object value = null; // リクエスト時の保持オブジェクト public Object keepObject = null; } /** * POSTパラメータクラス */ public static class Param { public static final int TYPE_STRING = 1; public static final int TYPE_IMAGE = 2; private int type; private String key; private String value; public Param(int type, String key, String value) { this.type = type; this.key = key; this.value = value; } } /** * リクエスト実行クラス */ private static class HttpRequest extends AsyncTask<Void, Void, Void> { // URL文字列 private String url = null; // POSTパラメータ private List<Param> params = new ArrayList<Param>(); // レスポンスハンドラ private ResponseHandlerBase handler = null; // 保持オブジェクト private Object keepObject = null; // レスポンスオブジェクト private Response ret = null; // interruptするスレッド private Thread interruptThread = null; @Override protected Void doInBackground(Void... params) { // URI構築 URI uri = null; try { uri = new URI(url); } catch (URISyntaxException e) { e.printStackTrace(); return null; } // GET/POSTリクエスト作成 HttpUriRequest request; if (this.params != null && this.params.size() > 0) { HttpPost r = new HttpPost(uri); //MultipartEntityBuilder entity = new MultipartEntityBuilder(); MultipartEntity entity = new MultipartEntity(); for (Param p : this.params) { switch (p.type) { case Param.TYPE_STRING: // 文字パラメータの場合 try { entity.addPart(p.key, new StringBody(p.value, "text/plain", Charset.forName("UTF-8"))); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } break; case Param.TYPE_IMAGE: // 画像パラメータの場合 entity.addPart(p.key, new FileBody(new File(p.value), "image/jpg")); break; } } r.setEntity(entity); //r.setEntity(MultipartEntity);//1606/08上に変更 request = r; } else { HttpGet r = new HttpGet(uri); request = r; } // リクエストを実行 DefaultHttpClient httpClient = new DefaultHttpClient(); try { httpClient.execute(request, new org.apache.http.client.ResponseHandler<Void>() { // HTTPレスポンスから,受信文字列をエンコードして文字列として返す @Override public Void handleResponse(HttpResponse response) throws IOException { if (ret == null) { ret = new Response(); } // ret = new Http.Response(); ret.code = response.getStatusLine() .getStatusCode(); // 正常に受信できた場合は200 if (ret.code == 200) { ret.value = handler .createObjectFromResponse(response); } // 保持オブジェクトを継承 ret.keepObject = keepObject; // スレッドが指定されている場合はinterrupt if (interruptThread != null) { interruptThread.interrupt(); } return null; } }); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 通信のshutdown if (httpClient != null) { try { httpClient.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } } } return null; } // タスク終了時 protected void onPostExecute(Void unused) { // 受信結果をUIに渡すためにまとめる Message message = new Message(); Bundle bundle = new Bundle(); bundle.putSerializable("http_response", ret); message.setData(bundle); // 受信結果に基づいてUI操作させる handler.sendMessage(message); } } /** * レスポンス実行ベースクラス */ public static abstract class ResponseHandlerBase extends Handler { // コンストラクタ public ResponseHandlerBase() { } // リクエストタスク完了時にコールされる public void handleMessage(Message msg) { try { onFinish((Response) msg.getData().get("http_response")); } catch (Exception e) { e.printStackTrace(); } } // レスポンス取得時にオブジェクトに変換するクラス public abstract Object createObjectFromResponse(HttpResponse response); // レスポンス完了時に呼ばれるクラス public abstract void onFinish(Response response); } /** * 同期リクエスト */ public static final Response requestSync(Request request, ResponseHandlerBase handler) { // レスポンス格納用 Response resp = new Response(); // リクエスト構築 HttpRequest httpReq = new HttpRequest(); httpReq.url = request.url; httpReq.handler = handler; if (request.params != null) { httpReq.params.addAll(request.params); } httpReq.keepObject = request.keepObject; httpReq.ret = resp; httpReq.interruptThread = Thread.currentThread(); // リクエスト実行 httpReq.execute(); // レスポンスが返るまで待機 while (true) { try { Thread.sleep(10000); } catch (InterruptedException e) { // レスポンスが返った break; } } // レスポンスを返す return resp; } /** * 非同期リクエスト */ public static final void request(Request request, ResponseHandlerBase handler) { // リクエスト構築 HttpRequest httpReq = new HttpRequest(); httpReq.url = request.url; httpReq.handler = handler; if (request.params != null) { httpReq.params.addAll(request.params); } httpReq.keepObject = request.keepObject; httpReq.ret = null; httpReq.interruptThread = null; // リクエスト実行 httpReq.execute(); } } //2) コードは専用の記述方法に変更・・・ と専用の記述方法に変更とはどのようにすればいいのでしょうか・・・? ###試したこと 課題に対してアプローチしたことを記載してください ネットで検索した様々な方法を試しました。 またprivate static void staticMethod1() などをstaticにしました。 ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報 AndroidStudioで以下のメッセージで悩んでいます。 This Handler class should be static or leaks might occur(null) このHandlerクラスは、静的であるべきか、リークが発生する可能性がありますとのことですが。 ネットで検索した様々な方法を試してもメッセージの表示がなくなりません。 AndroidからサーバーにPOST通信非同期でアクセスし、文字情報を受け取りたいのですが、 どこを書き換えればいいのでしょうか? どうかよろしくお願いします。
そのメッセージはどこに出ているのですか?通常どこかの行なり変数なりに対して出ると思うのですが…
以下のコード部分全部の背景が黄色くなりコードや変数上にマウスカーソルを置くと表示されます。
//public String onFinish(Http.Response response) {
// HTTPステータスコードが200
SharedPreferences pref =
getApplicationContext().getSharedPreferences( "PreferencesDATA", Context.MODE_PRIVATE );
ReqfromAnywhere=pref.getInt( "ReqfromAnywhere", 0 );//第二引数は、もしそのキーの値が存在しないときの初期値とする値を指定します。
if (response.code == 200) {
// 受信した文字列を取得
//String str = (String) response.value;
retStr = (String) response.value;
if(ReqfromAnywhere==0){
staticMethod();//返信DATAをDATAを仕分け
}else{
staticMethod();//1=紹介者処理へ
}
}
}
}
あなたの回答
tips
プレビュー