你怎么用asynctask json做pojo

时间:2017-03-06 00:21:00

标签: java android json android-asynctask pojo

我使用asynctask https://jsonplaceholder.typicode.com/users,但我采用了pojo对象。

我应该在两者之间添加代码?我应该写什么行,我应该怎么写?

DataRetriever.java

public DataRetriever(Activity activity) {
    activityWeakReference = new WeakReference<>(activity);
    current_activity = activityWeakReference.get();
}

@Override
protected void onPreExecute() {

    imageView = (ImageView) current_activity.findViewById(R.id.imageView);
    if (current_activity != null) {
        recyclerView = (RecyclerView) current_activity.findViewById(R.id.recyclerView);
        swipeRefreshLayout = (SwipeRefreshLayout) current_activity.findViewById(R.id.swipe_container);

        swipeRefreshLayout.setColorSchemeResources(
                android.R.color.holo_blue_bright,
                android.R.color.holo_green_light,
                android.R.color.holo_orange_light,
                android.R.color.holo_red_light);

        recyclerView.setHasFixedSize(true);

    } else {
        Log.d(TAG, "unable to get current activity");
        Toast.makeText(current_activity, "unable to get current activity", Toast.LENGTH_SHORT).show();
    }
    super.onPreExecute();
    progressDialog = new ProgressDialog(current_activity);
    progressDialog.setMessage("Loading...");
    progressDialog.show();
}

@SafeVarargs
@Override
protected final Integer doInBackground(List<String>... integers) {
    HttpURLConnection httpURLConnection = null;
    URL url;
    List<String> local_list = integers[0];
    type = Integer.parseInt(local_list.get(0));
    String jsonString, jsonData;
    return_status = 0;
    switch (type) {
        case 1:
            url_string = "https://jsonplaceholder.typicode.com/users";
            break;
        case 2:
            url_string = "https://jsonplaceholder.typicode.com/albums";
            recieved_id = Integer.parseInt(local_list.get(1));
            title = local_list.get(2);
            break;
        case 3:
            url_string = "https://jsonplaceholder.typicode.com/photos";
            recieved_id = Integer.parseInt(local_list.get(1));
            title = local_list.get(2);
            break;
    }
    try {
        url = new URL(url_string);
        httpURLConnection = (HttpURLConnection) url.openConnection();
        int statusCode = httpURLConnection.getResponseCode();
        if (statusCode == 200) {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            StringBuilder stringBuilder = new StringBuilder();
            while ((jsonData = bufferedReader.readLine()) != null) {
                stringBuilder.append(jsonData);
            }
            jsonString = stringBuilder.toString();
            jsonParser(jsonString);
            return_status = 1;
        } else {
            Log.d(TAG, "Some error occurred could'nt fetch data");
            Toast.makeText(current_activity, "Some error occurred could'nt fetch data", Toast.LENGTH_SHORT).show();
            return_status = 0;
        }
        publishProgress(local_list);
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    } finally {
        if (httpURLConnection != null) {
            httpURLConnection.disconnect();
        }
    }

    return return_status;
}


private void jsonParser(String jsonString) {
    int names_count, id;
    String name;
    try {
        JSONArray jsonArray = new JSONArray(jsonString);
        names_count = jsonArray.length();
        if (!listValues.isEmpty())
            listValues.clear();
        if (!pictureValues.isEmpty())
            pictureValues.clear();
        for (int i = 0; i < names_count; i++) {
            JSONObject array_items = jsonArray.getJSONObject(i);
            ListValues jsonValues, pictureValue;
            switch (type) {
                case 1:
                    id = array_items.optInt("id");
                    name = array_items.optString("name");
                    jsonValues = new ListValues(id, name);
                    listValues.add(jsonValues);
                    break;
                case 2:
                    id = array_items.optInt("userId");
                    name = array_items.optString("title");
                    if (id == recieved_id) {
                        jsonValues = new ListValues(id, name);
                        listValues.add(jsonValues);
                    }
                    break;
                case 3:
                    id = array_items.optInt("albumId");
                    name = array_items.optString("title");
                    String pictureURL = array_items.getString("url");
                    if (id == recieved_id) {
                        jsonValues = new ListValues(id, name);
                        pictureValue = new ListValues(id, pictureURL);
                        listValues.add(jsonValues);
                        pictureValues.add(pictureValue);
                    }
                    break;
            }
        }
    } catch (JSONException e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

@Override
protected void onProgressUpdate(final List<String>... values) {
    List<String> progressList = values[0];
    Log.d(TAG, progressList.get(0));
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            switch (type) {
                case 1:
                    new DataRetriever(current_activity).execute(values[0]);
                case 2:
                    new DataRetriever(current_activity).execute(values[0]);
                case 3:
                    new DataRetriever(current_activity).execute(values[0]);
            }
        }
    });
    super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(final Integer integer) {
    if (integer != 0) {

        recyclerAdapter = new RecyclerAdapter(listValues);
        recyclerView.addItemDecoration(new ListItemDecorator(current_activity.getApplicationContext()));
        recyclerView.setAdapter(recyclerAdapter);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(current_activity);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());


        if (swipeRefreshLayout.isRefreshing())
            swipeRefreshLayout.setRefreshing(false);

        recyclerView.addOnItemTouchListener(new       RecyclerTouchListener(current_activity.getApplicationContext(), recyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                String pictureURL = null;
                ListValues feed = listValues.get(position);
                if (!pictureValues.isEmpty()) {
                    ListValues feed2 = pictureValues.get(position);
                    pictureURL = feed2.getValue();
                }
                String value = feed.getValue();
                switch (type) {
                    case 1:
                        intent = new Intent(current_activity, AlbumActivity.class);
                        intent.putExtra("id", (position + 1));
                        intent.putExtra("value", value);
                        current_activity.startActivity(intent);
                        break;
                    case 2:
                        intent = new Intent(current_activity, PhotosActivity.class);
                        intent.putExtra("id", (position + 1));
                        intent.putExtra("value", value);
                        current_activity.startActivity(intent);
                        break;
                    case 3:
                        intent = new Intent(current_activity, ImageDisplay.class);
                        intent.putExtra("imageUrl", pictureURL);
                        current_activity.startActivity(intent);
                        break;
                }
            }

            @Override
            public void onLongClick(View view, int position) {
            }
        }));
    } else {
           //            Log.d(TAG, "unable to get data");
        if (swipeRefreshLayout.isRefreshing()) {
            Toast.makeText(current_activity, "Unable to refresh data! Try opening application again", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(current_activity, "Failed to fetch data! try again", Toast.LENGTH_SHORT).show();
        }
    }
    super.onPostExecute(integer);
    progressDialog.dismiss();
}

public interface ClickListener {
    void onClick(View view, int position);

    void onLongClick(View view, int position);
}

public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}
  }

Post.java

public class Post implements Serializable {
@SerializedName("userId")
private int userId;
@SerializedName("name")
@Expose
public String name;

@SerializedName("id")
private int id;

@SerializedName("title")
private String title;

@SerializedName("body")
private String body;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getUserId() {
    return userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}
  }

您对我的重要建议

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用GSON和POJO轻松完成此操作

首先..你需要创建几个模型

Post.java

public class Post
{
    private String id;

    private String phone;
    private String username;
    private String website;
    private Address address;
    private String email;
    private Company company;
    private String name;

    //setter and getter
}

Company.java

public class Company
{
    private String catchPhrase;
    private String name;
    private String bs;

    //setter and getter
}

Address.java

public class Address
{
    private Geo geo;
    private String zipcode;
    private String street;
    private String suite;
    private String city;

    //setter and getter
}

Geo.java

public class Geo
{
    private String lng;
    private String lat;

    //setter and getter
}

之后,您将从API获得json字符串。用Gson解析它..

List<Post> post = new Gson().fromJson(YOUR_JSON_STRING,new TypeToken<List<Post>>() {}.getType());