从异步任务获取数据到片段类

时间:2014-08-10 10:04:35

标签: android android-fragments

我是android的初学者。如何从 AsyncTask 获取数据到占位符fragment2类我无法从AsyncTask访问actor列表。如果我将数据作为放置片段中的数组获取,我可以使用它来创建列表视图从异步任务检索的数据。

public static class PlaceholderFragment2 extends Fragment {


    private static final String ARG_SECTION_NUMBER = "section_number";

    ListView list;
    ActorsAdapter adapter;
    ArrayList<Actors> actorsList;




    public static PlaceholderFragment2 newInstance(int sectionNumber) {
        PlaceholderFragment2 fragment = new PlaceholderFragment2();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment2() {


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_json, container, false);
        list = (ListView) rootView.findViewById(R.id.listView_news);
        actorsList = new ArrayList<Actors>();

        new ActorsAsyncTask().execute("https://myurl.com");



        //EDITED Code







        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MyActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}

public static class ActorsAsyncTask extends AsyncTask<String,Void,Boolean>
{
    @Override
    protected Boolean doInBackground(String... strings) {

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(strings[0]);


        try {
            HttpResponse response = client.execute(post);
            int status = response.getStatusLine().getStatusCode();

                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);
            if(data != null) {

                JSONObject object = new JSONObject(data);
                String results = object.getString("results");
                Log.d("Response: ", "> " + results);

                JSONObject object1 = new JSONObject(results);
                JSONArray jArray = object1.getJSONArray("collection1");


                for (int i = 0; i < jArray.length(); i++) {

                    Actors actor = new Actors();
                    JSONObject object2 = jArray.getJSONObject(i);


                    String property1 = object2.getString("property1");
                    JSONObject object3 = new JSONObject(property1);
                    actor.setHref(object3.getString("href"));
                    String href = object3.getString("href");
                    actor.setText(object3.getString("text"));
                    String text = object3.getString("text");
                    // Log.d("text", text);
                    Log.d("href", href);
                    Log.d("text",text);

                 actorsList.add(actor);////////////////not working



                }
            }
                else{
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

}

public class Actors {
    private String text ;
    private String href;


    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getHref() {
        return href;
    }

    public void setHref(String href) {
        this.href = href;
    }

    public Actors(){

    }
}

1 个答案:

答案 0 :(得分:4)

你可以指定你的doInBackground的结果(现在你有布尔值)在onPostExecute(在主线程中工作)得到这个结果

public static class ActorsAsyncTask extends AsyncTask<String,Void,List<Actors>> {
    @Override
    protected List<Actors> doInBackground(String... strings) {
        //make request and get actors
        List<Actors> result = new ArrayList<Actors>();
        for (int i = 0; i < jArray.length(); i++) {
            Actrots actorsFromJson;
            //create actors object from JSON data
            result.add(actorsFromJson);
        }
        return result;
    }

    @Override
    public void onPostExecute(List<Actors> result) {
        actorsList.addAll(result);
        //TODO processing data for display it. This is UI thread.
    }
}

<强> UPD: 您的异步任务类不是片段的内部类,因此,您有两种解决方法:

1)创建界面并将其设置为AsyncTask以获得任何反应

public interface TaskResult {
    void onSuccess(List<Actors> result);
}

TaskResult taskResult;

中添加新字段ActorsAsyncTask

您可以从构造函数设置值:

public ActorsAsyncTask(TaskResult taskResult) {
    this.taskResult = taskResult;
}

或来自setter

public void setTaskResultCallback() {
    this.taskResult = taskResult;
}

然后从taskResult.onSuccess(result);

致电onPostExecute

2)您可以将ActorsAsyncTask签名更改为public class ActorsAsyncTask 并把它放到PlaceholderFragment2类,如:

public static class PlaceholderFragment2 extends Fragment {
//some code here
    public class ActorsAsyncTask extends AsyncTask {
         //some code here
    }
}

如果您的应用程序的逻辑可以接受它。