2015-06-07 2 views
0

Я новичок в Android. Выборе действия в menu item я хочу вызвать метод, который находится в MyclassAsyncTask продолжаются. Метод, который я хочу назвать, - doInBackground. Myclass - класс, присутствующий в MainActivityFragment.java.NoSuchMethodException для вызова doInBackground

Мой XML для меню выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item 
     android:title="Refresh" 
     android:id="@+id/action_refresh" 
     android:label="@string/refresh" 
     android:onClick="doInBackground" 
     /> 

</menu> 

Но запуске приложения я получаю NoSuchMethodException.

Я попытался вызвать метод внутри MainActivity, а затем оттуда вызывая метод doInBackground, но затем он дает мне ошибку doInBackground имеет защищенный доступ.

Пожалуйста, помогите.

Вот полный код MainActivityFragment.java

public class MainActivityFragment extends Fragment { 

    public MainActivityFragment() { 
    } 

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



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootview = inflater.inflate(R.layout.fragment_main, container, false); 
     ArrayList<String> x = new ArrayList<String>(); 
     x.add("Today - sunny 88/63"); 
     x.add("Tomorrow - Foggy 76/43"); 
     x.add("Weds - cloudy 72/63"); 
     x.add("Thrus - rainy 64/51"); 
     x.add("Fri - foggy 70/46"); 
     x.add("Sat - sunny 76/68"); 
     ArrayAdapter<String> weather_adapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast, R.id.list_item_forecast_textview, x); 
     ListView listview = (ListView) rootview.findViewById(R.id.list_view_forecast); 
     listview.setAdapter(weather_adapter); 



     return rootview; 
    } 
    public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) 
    { 
     inflater.inflate(R.menu.forecast_fragment,menu); 
    } 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     int id=item.getItemId(); 
     if(id==R.id.action_refresh) { 
      FetchWeatherTask w=new FetchWeatherTask(); 
      w.execute(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

class FetchWeatherTask extends AsyncTask 
{ 



    @Override 
    protected Object doInBackground(Object[] params) { 
     // These two need to be declared outside the try/catch 
     // so that they can be closed in the finally block. 
     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     // Will contain the raw JSON response as a string. 
     String forecastJsonStr = null; 

     try { 
      // Construct the URL for the OpenWeatherMap query 
      // Possible parameters are avaiable at OWM's forecast API page, at 
      // http://openweathermap.org/API#forecast 
      URL url = new URL("http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7"); 

      // Create the request to OpenWeatherMap, and open the connection 
      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. 
       return null; 
      } 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
       // But it does make debugging a *lot* easier if you print out the completed 
       // buffer for debugging. 
       buffer.append(line + "\n"); 
      } 

      if (buffer.length() == 0) { 
       // Stream was empty. No point in parsing. 
       return null; 
      } 
      forecastJsonStr = buffer.toString(); 
     } catch (IOException e) { 
      Log.e("MainActivityFragment", "Error ", e); 
      // If the code didn't successfully get the weather data, there's no point in attemping 
      // to parse it. 
      return null; 
     } finally{ 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (final IOException e) { 
        Log.e("MainActivityFragment", "Error closing stream", e); 
       } 
      } 
     } 

     return null; 
    } 
} 
+0

Можете ли вы разместить свой код, как вы звоните – Pankaj

+1

Вы должны вызвать 'classNameExtendingAsyncTask k = new classNameExtendingAsyncTask(); k.execute() 'для вызова метода doInBackground(). execute() вызовет doInBackground(). – Psypher

+0

Я действительно вызывал Myclass_object.execute(), но это дает мне исключение. –

ответ

4

Просто удалите эту строку

android:onClick="doInBackground" 

, и он будет работать нормально. Я запустил его в своей системе, и ваш код в порядке.

+0

Хорошо, что хорошо. Но теперь возникает другая проблема. Когда я нажимаю кнопку обновления, мои поддельные данные не обновляются реальными данными. Он остается тем же. –

+0

Это потому, что вы нигде не обновляете его. Вам необходимо переопределить onPostExecute и обновить адаптер там. Взгляните на этот https://github.com/udacity/Sunshine-Version-2/compare/2.08_json_parsing...2.09_display_data – varunkr

+0

Я обновил адаптер и добавил метод onPostExecute и сделал все то, что инструктор спросил, обновление ничего не делает. В журнале я увидел ошибку MalformedURLException. –

1

Вам нужно определить метод в классе MainActivityFragment, вы не можете использовать один в AsyncTask. В пункте меню подпись

public boolean methodname(MenuItem item) { 
// actions 
} 

В вашем случае:

public boolean doInBackground(MenuItem item){ 
    FetchWeatherTask w=new FetchWeatherTask(); 
    w.execute(); 
    return true; 
} 

Или просто удалить OnClick в XML, и onOptionsItemSelected должны заботиться о нем.

+0

Хорошо, это прекрасно. Но теперь возникает другая проблема. Когда я нажимаю кнопку обновления, мои поддельные данные не обновляются с реальными данными. Это остается неизменным. –

Смежные вопросы