質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

1848閲覧

This Handler class should be static or leaks might occur(null)

akiba110

総合スコア8

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/06/09 21:04

編集2016/06/10 14:33

###前提・実現したいこと
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通信非同期でアクセスし、文字情報を受け取りたいのですが、 どこを書き換えればいいのでしょうか? どうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2016/06/09 23:26

Handlerを使っているところを追記してください。 また、コードは専用の記述方法に変更してください。
akiba110

2016/06/10 14:23

ありがとうございます。お世話になります。
yona

2016/06/10 14:52

コード専用の記述についてはヘルプを見てください。
swordone

2016/06/10 14:54

そのメッセージはどこに出ているのですか?通常どこかの行なり変数なりに対して出ると思うのですが…
akiba110

2016/06/10 15:23

以下のコード部分全部の背景が黄色くなりコードや変数上にマウスカーソルを置くと表示されます。 //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=紹介者処理へ } } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問