Programim dhe zhvillim, javascript, python, php, html

Pse nuk marr të dhëna List‹MovieModel› ArrayList nga klasa e veçantë AsyncTask në klasën e Fragmentit?

Ju lutem më ndihmoni ku e kam gabim. Unë jam i ri dhe i lodhur me këtë problem. Unë kam një klasë ForcastTask zgjeron AsyncTask, një tjetër klasë ForcastFragment zgjeron Fragment implementon AsyncResponse dhe klasën e Aktivitetit kryesor.

Dua të marr onPostExcute(Lista e të dhënave) nga klasa AsyncTask dhe të dërgoj në klasën ForcastFragment duke përdorur ndërfaqen AsyncResponse.

Por tregon vetëm null, kontrollova parametrin tim të pyetjes në json viewer në internet funksionon dhe kur e provoj në klasën e vetme, atëherë funksionon siç duhet.

public class ForecastTask extends AsyncTask<String, String, List<MovieModel>> {
    private final String LOG_TAG = ForecastTask.class.getSimpleName();    
    public AsyncResponse delegate=null;
    public List<MovieModel> movieModelList=null;
    @Override
    protected List<MovieModel> doInBackground(String... params) {
        if (params.length == 0) {
            return null;
        }

        String Popularity = "http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=XXXXXxxxxxxxxxxxxx";

        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(Popularity);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();

            InputStream inputStream = connection.getInputStream();
            if (inputStream == null) {
                return null;
            }

            reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer buffer = new StringBuffer();
            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            JSONObject jsonObject = new JSONObject(buffer.toString());
            JSONArray jsonArray = jsonObject.getJSONArray("results");

            //adding JSON Array data into MovieModel Class
            movieModelList = new ArrayList<>();
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject finalObject = jsonArray.getJSONObject(i);
                MovieModel movieModel = new MovieModel();
                    movieModel.setId(finalObject.getInt("id"));
                    movieModel.setTitle(finalObject.getString("title"));
                    movieModel.setPoster_path(finalObject.getString("poster_path"));
                    movieModel.setRelease_date(finalObject.getString("release_date"));
                    movieModel.setVote_average((float) finalObject.getDouble("vote_average"));
                    movieModel.setOverview(finalObject.getString("overview"));
                movieModelList.add(movieModel);
            }

            return movieModelList;
        } catch (JSONException | IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
         }
        return null;
    }

    @Override
    protected void onPostExecute(List<MovieModel> movieModels) {
        delegate.processFinish(movieModels);
    }
}

2- Klasa ParashikimiFragment

public class ForecastFragment extends Fragment implements AsyncResponse{
    private List<MovieModel> movieModelList=null;
    private static final String STATE_MOVIES ="state_movies";
    private CustomAdapter customAdapter =null;
    private GridView gridView=null;
    private View rootView=null;

    ForecastTask forecastTask=new ForecastTask();

    //Constructor
    public ForecastFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        forecastTask.delegate=this;
        forecastTask.execute("Popular");
    }
    @Override
    public void processFinish(List<MovieModel> movieModels) {
        movieModelList=movieModels;
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelableArrayList(STATE_MOVIES, (ArrayList<? extends Parcelable>) movieModelList);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.most_Popular:
                if(item.isChecked()){
                    item.setChecked(false);
                }else{
                    item.setChecked(true);
                    new ForecastTask().execute("Popular");
                    return true;
                }
            case R.id.High_rated:
                if(item.isChecked()){
                    item.setChecked(false);
                }else{
                    item.setChecked(true);
                    new ForecastTask().execute("TOP_RATED");
                    return true;
                }
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.activity_main, container, false);

        customAdapter= new CustomAdapter(
                getActivity(),
                R.layout.list_image_forecast,
                movieModelList);
        gridView=(GridView)rootView.findViewById(R.id.gridView);

        if (movieModelList==null){
            Toast.makeText(getActivity(),"Null",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(getActivity(), "Data", Toast.LENGTH_SHORT).show();

            gridView.setAdapter(customAdapter);
            gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String movie_name = movieModelList.get(position).getTitle();
                    String poster_path = movieModelList.get(position).getPoster_path();
                    String release_date = movieModelList.get(position).getRelease_date();
                    Float users_rating = movieModelList.get(position).getVote_average();
                    String overview = movieModelList.get(position).getOverview();

                    Intent intent = new Intent(getActivity(), DetailActivity.class)
                            .putExtra("movie_Name", movie_name)
                            .putExtra("poster_Path", poster_path)
                            .putExtra("release_Date", release_date)
                            .putExtra("users_Rating", users_rating)
                            .putExtra("overview", overview);
                    startActivity(intent);
                }
            });
        }
        return rootView;
    }
}

3- Ndërfaqja asinkronike

public interface AsyncResponse {
    void processFinish(List<MovieModel> movieModels);
}

4-DB filmi

public class MovieModel implements Parcelable {
    private int id;
    private String title;
    private String poster_path;
    private String release_date;
    private float vote_average;
    private String overview;

    private List<MovieModel> models;
    public MovieModel(){

    }

    public List<MovieModel> getModels() {
        return models;
    }

    public void setModels(List<MovieModel> models) {
        this.models = models;
    }

    public MovieModel(int id, String title, String poster_path, String release_date, float vote_average, String overview) {
        this.id = id;
        this.title = title;
        this.poster_path = poster_path;
        this.release_date = release_date;
        this.vote_average = vote_average;
        this.overview = overview;
    }

    protected MovieModel(Parcel in) {
        id = in.readInt();
        title = in.readString();
        poster_path = in.readString();
        release_date = in.readString();
        vote_average = in.readFloat();
        overview = in.readString();
    }

    public static final Creator<MovieModel> CREATOR = new Creator<MovieModel>() {
        @Override
        public MovieModel createFromParcel(Parcel in) {
            return new MovieModel(in);
        }

        @Override
        public MovieModel[] newArray(int size) {
            return new MovieModel[size];
        }
    };

    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 getPoster_path() {
        return poster_path;
    }
    public void setPoster_path(String poster_path) {
        this.poster_path = poster_path;
    }

    public String getRelease_date() {
        return release_date;
    }
    public void setRelease_date(String release_date) {
        this.release_date = release_date;
    }

    public float getVote_average() {
        return vote_average;
    }
    public void setVote_average(float vote_average) {
        this.vote_average = vote_average;
    }

    public String getOverview() {
        return overview;
    }
    public void setOverview(String overview) {
        this.overview = overview;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(id);
        out.writeString(title);
        out.writeString(poster_path);
        out.writeString(release_date);
        out.writeFloat(vote_average);
        out.writeString(overview);
    }

}

5- Veprimtaria kryesore

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Call the ForecastFragment Class by getFragmentManager
        getFragmentManager()
                .beginTransaction()
                .add(R.id.Fragment_Container, new ForecastFragment(),
                        ForecastTask.class.getSimpleName())
                .commit();
    }

Përgjigjet:


1

Ju po caktoni delegate vetëm një herë në forecastTask të përcaktuar si një anëtar i fragmentit. Por ju krijoni detyra të shumta në vende të tjera pa caktuar delegatin e tyre. Ju ndoshta duhet të caktoni delegat për secilën nga detyrat veç e veç për secilën detyrë për të bërë ndryshime në onPostExecute, ose do të rrëzohet me një NullPointerException.

15.03.2016
  • Ju lutem mund të më jepni një shembull. E provoj, ose ju lutemi hidhni një sy lidhjes sime të github: github.com/superssingh/MyMovieApp_Testing.git 16.03.2016

  • 2

    Unë do t'ju rekomandoja të kaloni një objekt të AsyncResponse tuaj te konstruktori ForecastTask.

    public ForecastTask(AsyncResponse listener){
        delegate = listener;
    }
    

    dhe në fragmentin tuaj mund ta bëni këtë.

    ForecastTask forecastTask = new ForecastTask(this);
    forecastTask.execute("Popular");
    
    15.03.2016
  • Mundohem por nuk funksionon. ju lutem hidhini një sy llogarisë sime të github ku e kam gabim lidhjen: github.com/superssingh/MyMovieApp_Testing.git 16.03.2016
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..