0

以下のコードを試し、AsyncTaskLoaderアプローチも試しました。をインスタンス化すると、アプリがクラッシュしますAsyncTask。タブホスト内のリストフラグメントにJSONをロードするための最良のアプローチについてアドバイスしてください。

以下のコードはタブ フラグメントです (メイン アクティビティでアクション バーのタブを使用します)。

public class TabTop extends ListFragment {
Context context = getActivity().getBaseContext();
String API_URL = "http://api.rottentomatoes.com/api/public/v1.0/movies/770672122/similar.json?apikey=crhhxb4accwwa6cy6fxrm8vj&limit=1";
ArrayList<Deal> deals;
DealsListAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        @SuppressWarnings("unused")
        int a = 0;
        return super.onCreateView(inflater, container, savedInstanceState);
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    GetTopDeals getTopDeals = new GetTopDeals(context);
    getTopDeals.execute(API_URL);
    super.onActivityCreated(savedInstanceState);
}


class GetTopDeals extends AsyncTask<String, Void, ArrayList<Deal>>{
    ProgressDialog progressDialog;

    public GetTopDeals(Context activity) {
        this.progressDialog = new ProgressDialog(activity);
    }

    @Override
    protected void onPostExecute(ArrayList<Deal> result) {
        adapter = new DealsListAdapter(context, result);
        setListAdapter(adapter);
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        progressDialog.setCancelable(true);
        progressDialog.setProgress(0);
        progressDialog.setMessage("loading Top deals...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        super.onPreExecute();
    }


    @Override
    protected ArrayList<Deal> doInBackground(String... urls) {
        String response = sendRequest(urls[0]); // make request for json
        return processResponse(response); // parse the Json and return ArrayList to postExecute

    }

    private String sendRequest(String apiUrl) {
        BufferedReader input = null; // get the json
        HttpURLConnection httpCon = null; // the http connection object
        StringBuilder response = new StringBuilder(); // hold all the data from the jason in string separated with "\n"

        try {
            URL url = new URL(apiUrl);
            httpCon = (HttpURLConnection) url.openConnection();

            if (httpCon.getResponseCode() != HttpURLConnection.HTTP_OK) { // check for connectivity with server
                return null;
            }
            input = new BufferedReader(new InputStreamReader(httpCon.getInputStream())); // pull all the json from the site
            String line;
            while ((line = input.readLine()) != null) {
                response.append(line + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (httpCon != null) {
                httpCon.disconnect();
            }
        }
        return response.toString();
    }
}

public ArrayList<Deal> processResponse(String response) {
    try {
        JSONObject responseObject = new JSONObject(response); // Creates a new JSONObject with name/value mappings from the JSON string.
        JSONArray results = responseObject.getJSONArray("movies"); // Returns the value mapped by name if it exists and is a JSONArray.
        deals = new ArrayList<Deal>();
        for (int i = 0; i < results.length(); i++) { // in this loop i copy the json array to movies arraylist in order to display  listView
            JSONObject jMovie = results.getJSONObject(i);
            int api_id = jMovie.getInt("id");
            String name = jMovie.getString("title");
            String content = jMovie.getString("synopsis");
            JSONObject posters = jMovie.getJSONObject("posters");
            String image_url = posters.getString("profile"); 
        }
    }catch (JSONException e) {
        e.printStackTrace();
    }
    return deals;
}

@Override
public void onStart() {
    super.onStart();

}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Intent intent = new Intent(getActivity().getBaseContext(), DealInformation.class);
    startActivity(intent);
    super.onListItemClick(l, v, position, id);
}
}
4

3 に答える 3

1

彼自身のファイルで非同期タスクを作成します。

そして、非同期タスクが終了したら、自動的に呼び出されるOnPostExecuteを実装します。次のようなnotifyDataSetChangedでアダプタに通知します。

    @Override
    protected void onPostExecute(List<NewItem> list) {
    Adapter.getListe().clear();     
    Adapter.getListe().addAll(list);
    Adapter.notifyDataSetChanged();
}
于 2013-03-13T13:46:57.407 に答える
1

君たちありがとう、

私の答えを投稿したいです。いくつかの調査の後、AsyncTaskLoader を使用することにしました。これは私のコードです

public class TabOurPicks extends ListFragment implements LoaderCallbacks<String[]>  {

// when activity loads- onActivityCreated() calls the initLoader() who activate onCreateLoader()
@Override
public void onActivityCreated(Bundle savedInstance) {
    super.onActivityCreated(savedInstance);
    setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, new String[]{}));
    getLoaderManager().initLoader(0, null,this).forceLoad();
}

// onCreateLoader instantiate the asynctaskloaser who work in bg
@Override
public RSSLoader onCreateLoader(int arg0, Bundle arg1) {
    return new RSSLoader(getActivity());  // 
}

// after bg process invoke onLoadFinished() who work in ui thread
@Override
public void onLoadFinished(Loader<String[]> loader, String[] data) {
    setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data
) );

}

@Override
public void onLoaderReset(Loader<String[]> arg0) {
    // TODO Auto-generated method stub

}

これはローダーの内部クラスです。

static public class RSSLoader extends AsyncTaskLoader<String[]>
{
    public RSSLoader(Context context) {
        super(context);
    }

    @Override
    public String[] loadInBackground() {
        String url = "http://api.rottentomatoes.com/api/public/v1.0/movies/770672122/similar.json?apikey=crhhxb4accwwa6cy6fxrm8vj&limit=1";
        String response = sendRequest(url);
        return processResponse(response);
    }


    private String sendRequest(String url) {
        BufferedReader input = null; // get the json
        HttpURLConnection httpCon = null; // the http connection object
        StringBuilder response = new StringBuilder(); // hold all the data from the jason in string separated with "\n"

        try {
            URL apiUrl = new URL(url);
            httpCon = (HttpURLConnection) apiUrl.openConnection();

            if (httpCon.getResponseCode() != HttpURLConnection.HTTP_OK) { // check for connectivity with server
                return null;
            }
            input = new BufferedReader(new InputStreamReader(httpCon.getInputStream())); // pull all the json from the site
            String line;
            while ((line = input.readLine()) != null) {
                response.append(line + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (httpCon != null) {
                httpCon.disconnect();
            }
        }
        return response.toString();
    }

    private String[] processResponse(String response) {
        String[] deals = null;
        try {
            JSONObject responseObject = new JSONObject(response); // Creates a new JSONObject with name/value mappings from the JSON string.
            JSONArray results = responseObject.getJSONArray("movies"); // Returns the value mapped by name if it exists and is a JSONArray.
            deals = new String[10];
            for (int i = 0; i < 9; i++) { // in this loop i copy the json array to movies arraylist in order to display  listView
                JSONObject jMovie = results.getJSONObject(i);
                String name = jMovie.getString("title");
                deals[i] = name;
            }
        }catch (JSONException e) {
            e.printStackTrace();
        }
        return deals;
    }
}

}
于 2013-03-14T08:47:03.477 に答える
0

asynctask に独自のファイルがあるかどうかは問題ではありません。アクティビティが非同期になるため、アクティビティが asynctask を拡張するのは望ましくありませんが、Java の二重継承ルールにより、とにかくこれを行うことは不可能です。

アプリのアーキテクチャとプログラミング スタイルに基づいて、非同期タスクをアクティビティの内部クラスにすることができます。PostExecute メソッドで、アダプターにデータを与え、アダプターがリストに設定されていることを確認してから、notifyDataSetChanged() を実行します。

asynctask がキャッシュまたはネットワークからデータをロードしていると仮定すると、これに対するアプローチで正しい軌道に乗っています。

于 2013-03-13T13:52:30.767 に答える