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

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

ただいまの
回答率

87.94%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,381

score 8

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • yona

    2016/06/10 23:52

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

    キャンセル

  • swordone

    2016/06/10 23:54

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

    キャンセル

  • akiba110

    2016/06/11 00: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=紹介者処理へ

    }
    }
    }
    }

    キャンセル

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

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

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る