0

AsyncTaskバックグラウンドスレッドを使用してMainActivity FragmentにムービーポスターをロードするMovieAppを開発しています。私は、画像を表示するためにgridviewとBaseAdapterを使用しています。以下はコードです。MainActvityがアプリケーションの初回起動時に更新されない

MainActivityFragment.java:

package com.android.example.cinemaapp.app; 
import android.app.Fragment; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.GridView; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Serializable; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.HashMap; 


public class MainActivityFragment extends Fragment{ 

MoviePosterAdapter moviePosterAdapter; 
GridView posterGridView; 
public HashMap<String, JSONObject> movieMap; 

public MainActivityFragment() { 
} 

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

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

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.action_refresh) { 
     updateMovies(); 
    } 
    return super.onOptionsItemSelected(item); 
} 

public void updateMovies(){ 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    String sortBy = sharedPreferences.getString(getString(R.string.pref_sort_key), getString(R.string.pref_sort_popular)); 
    new FetchMoviePosterTask().execute(sortBy); 
} 

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

    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
    moviePosterAdapter = new MoviePosterAdapter(getActivity()); 
    posterGridView = (GridView) rootView.findViewById(R.id.gridview_movie); 
    posterGridView.setAdapter(moviePosterAdapter); 
    posterGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      // logic to start detail activity 
      startActivity(intent); 
     } 
    }); 
    return rootView; 
} 

public class FetchMoviePosterTask extends AsyncTask<String, String, Void> implements Serializable { 


    @Override 
    protected Void doInBackground(String... params) { 
     Log.v("FetchMoviePosterTask", "In background method"); 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     String movieJsonStr; 

     try { 

      //logic to create uri builder 

      URL url = new URL(builtUri.toString()); 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      // Read the input stream into a String 
      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 
      if (inputStream == null) { 
       // Nothing to do. 
       movieJsonStr = null; 
      } 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line + "\n"); 
      } 

      if (buffer.length() == 0) { 
       movieJsonStr = null; 
      } 
      movieJsonStr = buffer.toString(); 
      // Log.v("MainActivityFragment", "Movie json "+movieJsonStr); 

      try { 
       String[] posterPaths = getPosterPaths(movieJsonStr); 
       for(String path : posterPaths){ 
        publishProgress(path); 
       } 
      }catch(JSONException je){ 
       Log.e("MoviePosterPath","Error while parsing JSON"); 
      } 
     } catch (IOException e) { 
      Log.e("MoviePosterAdapter", "Error ", e); 
      movieJsonStr = null; 
     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (final IOException e) { 
        Log.e("MoviePosterAdapter", "Error closing stream", e); 
       } 
      } 
     } 
     return null; 
    } 

    public String[] getPosterPaths(String movieJsonStr) throws JSONException{ 
     final String POSTER_PATH = //some value 
     final String POSTER_SIZE = //some value 
     JSONObject jsonObject = new JSONObject(movieJsonStr); 
     JSONArray results = jsonObject.getJSONArray("results"); 
     String[] posterStrs = new String[results.length()]; 
     movieMap = new HashMap<String, JSONObject>(); 

     for(int i =0; i < results.length(); i++){ 
      JSONObject movieObj = (JSONObject) results.get(i); 
      posterStrs[i] = POSTER_PATH + POSTER_SIZE + movieObj.getString("poster_path"); 
      movieMap.put(posterStrs[i], movieObj); 
     } 

     return posterStrs; 
    } 

    @Override 
    protected void onProgressUpdate(String... posterValues){ 
     Log.v("FetchMoviePosterTask", "In onProgress method"); 
     moviePosterAdapter.add(posterValues[0]); 
     super.onProgressUpdate(posterValues); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     Log.v("FetchMoviePosterTask", "In onPostExecute method"); 
     moviePosterAdapter.notifyDataSetChanged(); 
     super.onPostExecute(result); 
    } 
} 
} 

MoviePosterAdapter.java:

package com.android.example.cinemaapp.app; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 

import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 


public class MoviePosterAdapter extends BaseAdapter { 

ArrayList<String> movieArray = new ArrayList<String>(); 
private Context mContext; 

public MoviePosterAdapter(Context c) { 
    mContext = c; 
} 

void add(String path){ 
    movieArray.add(path); 
} 

void clear(){ 
    movieArray.clear(); 
} 

void remove(int index){ 
    movieArray.remove(index); 
} 

@Override 
public int getCount() { 
    return movieArray.size(); 
} 

@Override 
public Object getItem(int position) { 
    return movieArray.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 

     imageView.setScaleType(ImageView.ScaleType.FIT_XY); 

    } else { 
     imageView = (ImageView) convertView; 
    } 

    Picasso.with(mContext).load(movieArray.get(position)).into(imageView); 
    return imageView; 
} 
} 

問題:アプリケーションが最初に起動すると、UIはimageviews移入取得されていません。 Logcatで私は[更新]ボタンをクリックするか、私はいくつかの他の活動やアプリに移動ムービーアプリUI(onResume())に戻った場合、それは完全に正常に動作しているときにコントロールがdoBackground(), onProgressUpdate()onPostExecute().

流れている見ることができました。画像が表示されます。

事前に感謝します。

+1

ライフサイクルに間違っている - 別のアプリに行って、戻ってくるだけでonResumeを呼び出すのではなく、onStartとonResumeを呼び出します。アプリが完全に画面から外れると、アプリは停止されます(onStopが呼び出されます)。 onStartは、アプリケーションが停止状態から再起動されるたびに呼び出されます。 –

+0

申し訳ありませんが、なぜアプリが最初に起動されたときに呼び出されないのですか?また、onCreateView()からupdateMovies()を呼び出すことで試してみましたが、まだ動作していません。 – Viv

答えて

0

updateMovies();onStart()からonCreateViewに変更する必要があります。 Gabe Sechanが言ったように、あなたはライフサイクルについて間違っています。フラグメントのライフサイクルについていくつかの調査をしてみてください。

+0

Yeh ..最初にOnCreateView();を呼び出します。 –

+1

フラグメントライフサイクルへのリンクhttp://developer.android.com/guide/components/fragments.html#Creating –

+0

hi ..私は変更を行ってみました..それは動作していません。 – Viv

0

メソッドupdateMovies()を呼び出すだけで済みます。 postGridView =(GridView)の後にonCreateView()から取得します。rootView.findViewById(R.id.gridview_movie);

start()からの呼び出しを削除します。

+0

こんにちは..私は変更を行ってみました..それは動作していません。 – Viv

関連する問題