2016-10-28 1 views
0

Я использовал это в другом месте как async, но я хотел реорганизовать его, чтобы сделать его многоразовым, как я могу реорганизовать код, чтобы работать как класс потребления ?. Он не работает, если он не асинхронный, а ip бэкэнда хорошо определен, так что это не так. Есть идеи?Как мне позвонить OK Сообщение HttpRequest из изолированного класса с использованием async?

public class HTTPRequestManager { 

    public static JSONArray fetchData(){ 


     return null; 

    } 

    public static String postData(Context context, String url, String JSONData) { 




      return null; 
    } 

    /* @Override 
    protected Integer doInBackground(String... strings) { 

     try { 
      //1.create client Object 
      OkHttpClient client = new OkHttpClient(); 
      //2.Define request being sent to server 
      RequestBody postData = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), JSONData); 
      Request request = new Request.Builder() 
        .url(context.getResources().getString(R.string.backend_base_url) + url) 
        .post(postData) 
        .build(); 

      //3.Transport the request and wait for response to process next 

      Response response = client.newCall(request).execute(); 
      String resultData = response.body().string(); 

      if (resultData.equals("OK")) { 

      } else { 
       //post failed 
       return "FAILED"; 


      } 


      return resultData; 
     } catch (Exception e) { 
      Log.d("API_CONNECTION_ERROR", "Couldn't connect to the API"); 
      return "API_CONNECTION_ERROR"; 
     } 

    }*/ 


} 

Я использовал, чтобы этот annonymous класса embeeded в другом классе, и он работает (это запрос прибудет), но проблема в том, что это не многоразовом таким образом:

public class AsyncHttpTask extends AsyncTask<String, Void, Integer> { 

     URL url = null; 

     @Override 
     protected void onPreExecute() { 

      getActivity().setProgressBarIndeterminateVisibility(true); 
     } 

     @Override 
     protected Integer doInBackground(String... params) { 
      Integer result = 0; 
      HttpURLConnection urlConnection; 
      try { 
       url = new URL (getResources().getString(R.string.backend_base_url) + 
         "api/flrcks/user/id/0/latitude/3000/longitude/300/within/9999999999999999999999999"); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       int statusCode = urlConnection.getResponseCode(); 

       // 200 represents HTTP OK 
       if (statusCode == 200) { 
        BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
        StringBuilder response = new StringBuilder(); 
        String line; 
        while ((line = r.readLine()) != null) { 
         response.append(line); 
        } 
        parseResult(response.toString()); 
        result = 1; // Successful 
       } else { 
        result = 0; //"Failed to fetch data!"; 
       } 
      } catch (Exception e) { 
       Log.d(TAG, e.getLocalizedMessage()); 
      } 
      return result; //"Failed to fetch data!"; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      // Download complete. Let us update UI 
      progressBar.setVisibility(View.GONE); 

      if (result == 1) { 
       adapter = new MyRecyclerAdapter_Nearby(getActivity(), feedsList); 
       mRecyclerView.setAdapter(adapter); 
       checkAdapterIsEmpty(); 
      } else { 
       Toast.makeText(getActivity(), "Failed to fetch data!", Toast.LENGTH_SHORT).show(); 
       t.setVisibility(View.VISIBLE); 
      } 
     } 

     private void parseResult(String result) { 
      try { 
       JSONObject response = new JSONObject(result); 

       JSONArray posts = response.getJSONArray("rows"); 
       feedsList = new ArrayList<>(); 

       JSONArray members; 
       for (int i = 0; i < posts.length(); i++) { 
        memberList = new ArrayList<>(); 
        final JSONObject post = posts.optJSONObject(i); 
        members=post.getJSONArray("members"); 
        final FeedItem item = new FeedItem(); 


       //for (int i = 0; i < posts.length(); i++) { 
        //JSONObject post = posts.optJSONObject(i); 
        //FeedItem item = new FeedItem(); 
        item.setId(post.optString("id")); 
        item.setTitle(post.optString("name")); 
        item.setDescription(post.optString("description")); 
        item.setPrivacy(post.optString("privacy_mode_description")); 
        item.setInitial_date(post.optString("initial_date")); 
        item.setThumbnail(post.optString("thumbnail")); 
        item.setColor_hex(post.optString("color_hex")); 
        item.setTag(post.optString("tag")); 
        item.setDistance(post.optInt("st_distance")); 


        //item.setThumbnail(post.optString("thumbnail")); 

        for(int k=0; k <members.length();k++) 
        { 
         MemberItem memberItem = new MemberItem(); 
         JSONObject member = members.optJSONObject(k); 
         memberItem.setName(member.optString("name")); 
         memberItem.setUsername(member.optString("username")); 
         memberItem.setProfile_pic(member.optString("profile_pic")); 
         memberItem.setIs_moderator(member.optBoolean("is_moderator")); 
         memberItem.setFacebookId(member.optString("facebook_id")); 



         memberList.add(memberItem); 
        } 
        item.setMemberList(memberList); 
        feedsList.add(item); 
       } 
      } 
      catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Какие изменения я нужно сделать, чтобы поместить его в изолированный файл, который будет потребляться всем приложением, например, в файле OkHTTPRequests.class ???

ответ

0

Создать интерфейс

public interface OnWebResponseListener { 
    void onWebResponse(CommonUtilities.services service, String result); 
} 

создать общественное перечисление для идентификации сервиса. в моем случае я создал CommonUtilities Java, где я объявил

public enum services { 
     LOGIN 
    } 

Ваш Common File

public class CallAddr extends AsyncTask<String, Void, String> { 
    CommonUtilities.services service; 
    OnWebResponseListener onWebResponseListener; 
    String url; 
    FormBody.Builder body; 
    Request request; 
    OkHttpClient client; 
    final static String TAG = "CallAddr"; 

    public CallAddr(Map<String, String> data, CommonUtilities.services service, OnWebResponseListener onWebResponseListener, String url) { 
     this.service = service; 
     this.onWebResponseListener = onWebResponseListener; 
     this.url = url; 
     body = new FormBody.Builder(); 
     for (String key : data.keySet()) { 
      body.add(key, data.get(key)); 
     } 
     client = new OkHttpClient(); 

    } 

    @Override 
    protected String doInBackground(String... strings) { 
     String result = ""; 
     request = new Request.Builder().url(url).post(body.build()).build(); 
     try { 
      Response response = client.newCall(request).execute(); 
      result = response.body().string(); 

     } catch (Exception e) { 
      Log.e(TAG,Log.getStackTraceString(e)); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     if (onWebResponseListener != null) { 
      onWebResponseListener.onWebResponse(service, s); 
     } 

    } 
} 
+0

Я не хочу, чтобы создать еще одну услугу, просто очередной класс, где для вызова апи асинхр. ... это обязательное обязательное обслуживание? Нет ли более простого решения? Я тоже не понимаю перечисление ... – Juan

+1

Мы не создаем никаких других сервисов. Enum - это как серия. Подумайте об этом, так как вы сделали три вызова api, используя общий класс, теперь вы получите три ответа асинхронно, вы не знаете, какой ответ против того, в каком вызове в этой ситуации вам нужно идентифицировать или маркировать ответ, там перечисление доступно. Просто goodle about enum –

+0

, что мне непонятно, это случай, когда у вас более одного вызова, где вы проверяете этот перечислитель, чтобы узнать, какой вызов? – Juan