2016-07-31 50 views
0

我正在开发一个Android应用程序,它可以根据moviedb.org API中的最受欢迎或最高评分排序影片。更改设置时,应用程序应该从服务器获取新数据。这不起作用。这里是我的代码,请帮助我通过它:运行时错误与安卓应用程序的编码设置

//MainActivity.java 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    if(savedInstanceState==null){ 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment,new MainActivityFragment()).commit(); 
    } 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     startActivity(new Intent(this,SettingsActivity.class)); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

//SettingsActivity.java 
@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.pref_general); 
    bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_order_key))); 
} 

public void bindPreferenceSummaryToValue(Preference preference){ 
    preference.setOnPreferenceChangeListener(this); 
    onPreferenceChange(preference, PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(),"")); 
} 

@Override 
public boolean onPreferenceChange(Preference preference, Object value) { 
    String stringValue=value.toString(); 
    if(preference instanceof ListPreference){ 
     ListPreference listPreference=(ListPreference)preference; 
     int prefIndex=listPreference.findIndexOfValue(stringValue); 
     if(prefIndex>=0){ 
      preference.setSummary(listPreference.getEntries()[prefIndex]); 
     } 
    }else { 
     preference.setSummary(stringValue); 
    } 
    return true; 
} 
//MainActivityFragment.java 
public MainActivityFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView=inflater.inflate(R.layout.fragment_main, container, false); 
    if (getActivity()!=null){ 
     ArrayList<String>arrayList=new ArrayList<String>(); 
     PosterAdapter imageAdapter=new PosterAdapter(getActivity(),arrayList,deviceWidth); 
     imageGridView=(GridView)rootView.findViewById(R.id.image_grid_view); 
     imageGridView.setColumnWidth(deviceWidth); 
     imageGridView.setAdapter(imageAdapter); 
    } 
    imageGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent(getActivity(), DetailActivity.class).putExtra("overview", overview.get(position)) 
        .putExtra("poster", images.get(position)) 
        .putExtra("title", title.get(position)) 
        .putExtra("date", date.get(position)) 
        .putExtra("rating", rating.get(position)); 
      startActivity(intent); 

     } 
    }); 
    return rootView; 
} 
private class PreferenceChangeListener implements SharedPreferences.OnSharedPreferenceChangeListener{ 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     imageGridView.setAdapter(null); 
     onStart(); 
    } 
} 
@Override 
public void onStart(){ 
    super.onStart(); 
    sharedPreferences= PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    preferenceChangeListener=new PreferenceChangeListener(); 
    sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener); 
    if (sharedPreferences.getString(getString(R.string.pref_order_key),"").equals(R.string.pref_order_most_popular)){ 
     sortByPopular=true; 
    }else if (sharedPreferences.getString(getString(R.string.pref_order_key),"").equals(R.string.pref_order_top_rated)){ 
     sortByPopular=false; 
    } 
     ImageLoader imageLoader=new ImageLoader(); 
    if (isInternetAvailable()) { 
     imageLoader.execute(); 
     Log.v(LOG_TAG,"async task completed"); 
    }else { 
     TextView textView=new TextView(getActivity()); 
     RelativeLayout relativeLayout=(RelativeLayout)getActivity().findViewById(R.id.fragment_layout); 
     textView.setText("There is no Internet service"); 
     if (relativeLayout.getChildCount()==1){ 
      relativeLayout.addView(textView); 
     } 
     imageGridView.setVisibility(GridView.GONE); 
    } 
} 
public boolean isInternetAvailable(){ 
    ConnectivityManager connectivityManager=(ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo(); 
    return networkInfo !=null&&networkInfo.isConnected(); 
} 
public class ImageLoader extends AsyncTask<Void,Void,ArrayList<String>>{ 


    @Override 
    protected ArrayList<String> doInBackground(Void... params) { 
     while (true){ 
      try { 
       images=new ArrayList<>(Arrays.asList(getPathsFromURL(sortByPopular))); 
       return images; 
      }catch (Exception e){ 
       continue; 
      } 
     } 
    } 
    @Override 
    protected void onPostExecute(ArrayList<String>results){ 
     if (results!=null&&getActivity()!=null){ 
      PosterAdapter posterAdapter=new PosterAdapter(getActivity(),results,deviceWidth); 
      imageGridView.setAdapter(posterAdapter); 
     } 
    } 
    public String[] getPathsFromURL(boolean sorting){ 

     while (true){ 
      HttpURLConnection httpURLConnection=null; 
      BufferedReader bufferedReader=null; 
      String JSONResult; 
      try { 
       if (sortByPopular){ 
        url = "http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=281ad0257e71bca17a21b42c9fee7304"; 
       }else { 
        url="http://api.themoviedb.org/3/discover/movie?sort_by=vote_average.desc&vote_count.gte=500&api_key=281ad0257e71bca17a21b42c9fee7304"; 
       } 
       URL url1=new URL(url); 
       httpURLConnection=(HttpURLConnection)url1.openConnection(); 
       httpURLConnection.setRequestMethod("GET"); 
       httpURLConnection.connect(); 
       InputStream inputStream=httpURLConnection.getInputStream(); 
       StringBuffer stringBuffer=new StringBuffer(); 
       if (inputStream==null){ 
        return null; 
       } 
       bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); 
       String data; 
       while ((data=bufferedReader.readLine())!=null){ 
        stringBuffer.append(data+"\n"); 
       } 
       if (stringBuffer.length()==0){ 
        return null; 
       } 
       JSONResult=stringBuffer.toString(); 
       Log.v(LOG_TAG,JSONResult); 
       try { 
        overview=new ArrayList<String>(Arrays.asList(getStringsFromAPI(JSONResult, "overview"))); 
        title=new ArrayList<String>(Arrays.asList(getStringsFromAPI(JSONResult, "original_title"))); 
        rating=new ArrayList<String>(Arrays.asList(getStringsFromAPI(JSONResult, "vote_average"))); 
        date=new ArrayList<String>(Arrays.asList(getStringsFromAPI(JSONResult, "release_date"))); 
        return getDataFromJSON(JSONResult); 
       }catch (JSONException e){ 
        return null; 
       } 
      }catch (Exception e){ 
       continue; 
      }finally { 
       if (httpURLConnection!=null){ 
        httpURLConnection.disconnect(); 
       } 
       if (bufferedReader!=null){ 
        try { 
         bufferedReader.close(); 
        }catch (final IOException e){ 

        } 
       } 
      } 
     } 
    } 
    } 
    public String[] getStringsFromAPI(String JSONStringParameter,String parameter) throws JSONException{ 
     JSONObject jsonObject=new JSONObject(JSONStringParameter); 
     JSONArray jsonArray=jsonObject.getJSONArray("results"); 
     String[] results=new String[jsonArray.length()]; 
     for (int i=0;i<jsonArray.length();i++){ 
      JSONObject poster=jsonArray.getJSONObject(i); 
      if (parameter.equals("vote_average")){ 
       Double decimalNumber=poster.getDouble("vote_average"); 
       String userRating=Double.toString(decimalNumber)+"/10"; 
       results[i]=userRating; 
      } 
      String posterPath=poster.getString(parameter); 
      results[i]=posterPath; 
     } 
     return results; 
    } 
    public String[] getDataFromJSON(String JSONStringParameter)throws JSONException{ 
     JSONObject jsonObject=new JSONObject(JSONStringParameter); 
     JSONArray jsonArray=jsonObject.getJSONArray("results"); 
     String[] results=new String[jsonArray.length()]; 
     for (int i=0;i<jsonArray.length();i++){ 
      JSONObject poster=jsonArray.getJSONObject(i); 
      String posterPath=poster.getString("poster_path"); 
      results[i]=posterPath; 
     } 
     return results; 
    } 
//PosterAdapter.java 
private Context context; 
private ArrayList<String> arrayList; 
private int posterWidth; 

public PosterAdapter(Context c,ArrayList<String> filePaths,int a){ 
    context=c; 
    arrayList=filePaths; 
    posterWidth=a; 
} 

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

@Override 
public Object getItem(int position) { 
    return null; 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView image; 
    if (convertView==null){ 
     image=new ImageView(context); 
    }else { 
     image=(ImageView)convertView; 
    } 
    String url = "http://image.tmdb.org/t/p/w185" + arrayList.get(position); 
    Picasso.with(context).load(url).into(image); 
    return image; 
} 

预先感谢您

回答

0

我跟另一个开发商,看来,我的代码是准确的,还有的是,其他开发人员正在努力的一个错误弄清楚。我会让你们张贴。感谢您的帮助。

相关问题