質問編集履歴

1 Handlerを使っているところを追記しました。コードは専用の記述方法に変更とは?どのようなことなのでしょうか?すみません、理解できなくて。

akiba110

akiba110 score 8

2016/06/10 23:33  投稿

This Handler class should be static or leaks might occur(null)
###前提・実現したいこと
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通信非同期でアクセスし、文字情報を受け取りたいのですが、
どこを書き換えればいいのでしょうか?
どうかよろしくお願いします。
どうかよろしくお願いします。
  • Android Studio

    6549 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る