2016-06-07 3 views
4

Это код, который я получил из Интернета, который мне нужен для моего собственного приложения. Я пытаюсь сделать приложение, используя этот пример. Разница в том, что я сделал один отдельный класс для этого имени JSONTask. Я получаю ошибку с функцией getApplicationContex(). Пожалуйста, помогите мне с этим.Не удается разрешить метод getApplicationContext()

import android.os.AsyncTask; 
import android.widget.ListView; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import navdrawerexample1.models.MovieModel; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 

public class JSONTask extends AsyncTask<String,String,List<MovieModel>> 
{ 
private ListView lvMovies; 
@Override 
protected List<MovieModel> doInBackground(String... params) { 
    HttpURLConnection connection = null; 
    BufferedReader reader = null; 
    try { 
     URL url= new URL(params[0]); 
     connection = (HttpURLConnection) url.openConnection(); 
     connection.connect(); 


     InputStream stream = connection.getInputStream(); 
     reader = new BufferedReader(new InputStreamReader(stream)); 
     StringBuffer buffer = new StringBuffer(); 
     String line =""; 
     while ((line = reader.readLine())!=null){ 
      buffer.append(line); 
     } 
     String finalJason = buffer.toString(); 

     JSONObject parentObject = new JSONObject(finalJason); 
     JSONArray parentArray = parentObject.getJSONArray("movies"); 

     List<MovieModel> movieModelList = new ArrayList<>(); 
     //StringBuffer finalBufferData = new StringBuffer(); 
     for (int i=0; i<parentArray.length();i++) { 
      JSONObject finalObject = parentArray.getJSONObject(i); 
      MovieModel movieModel = new MovieModel(); 
      movieModel.setMovie(finalObject.getString("movie")); 
      movieModel.setYear(finalObject.getInt("year")); 
      movieModel.setRating((float) finalObject.getDouble("rating")); 
      movieModel.setDuration(finalObject.getString("duration")); 
      movieModel.setDirector(finalObject.getString("director")); 
      movieModel.setTagline(finalObject.getString("tagline")); 
      movieModel.setImage(finalObject.getString("image")); 
      movieModel.setStory(finalObject.getString("story")); 

      List<MovieModel.cast> castList = new ArrayList<>(); 
      for (int j=0; j<finalObject.getJSONArray("cast").length();j++){ 
       MovieModel.cast cast = new MovieModel.cast(); 
       cast.setName(finalObject.getJSONArray("cast").getJSONObject(j).getString("name")); 
       castList.add(cast); 
      } 
      movieModel.setCastList(castList); 
      //adding the final object in the list 
      movieModelList.add(movieModel); 
     } 
     return movieModelList; 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException 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> result) { 
    super.onPostExecute(result); 
    //This is where I get the error 
    MovieAdapter adapter = new MovieAdapter(getApplicationContext(),R.layout.row,result); 
    lvMovies.setAdapter(adapter); 
    //TODO need to set data to the list 
} 

}

+0

возможно дубликат http://stackoverflow.com/ Вопросы/15278840/getapplicationcontext-in-asynctask-class –

+1

'getApplicationContext()' является публичной функцией 'Context'. Вам нужен объект, который происходит из 'Context', например' Activity', 'BroadcastReceiver' или' Service' – 0xDEADC0DE

ответ

7

Проблема в том, что вы вызываете getApplicationContext() внутри класса, который не расширяет Context или его подклассы (Activity и т. Д.). Вы должны передать Context или его подкласс в конструктор JSONTask. Кроме того, я не вижу, где вы инициализации lvMovies - и вы, вероятно, получить NullPointerException в lvMovies.setAdapter(adapter); - мое предложение заключается в том, что вы должны передать это, а также к вашему JSONTask конструктору:

private Context mContext; 
private ListView lvMovies; 
public JSONTask (Context context, ListView lstView){ 
    this.lvMovies = lstView; 
    this.mContext = context; 
} 

так, что в onPostExecute вы можете сделать что-то вроде:

MovieAdapter adapter = new MovieAdapter(mContext,R.layout.row,result); 
lvMovies.setAdapter(adapter); 

Надеюсь, это поможет.

1

Вы не можете получить доступ к getApplicationContext из asynTask потому getApplicationContext() не существует в AsyncTask. Сделать конструктор и передать контекст этому классу. Используйте его в своем классе JSONTask.

Я бы порекомендовал вам использовать библиотеку Volley вместо AsyncTask.

0

создать конструктор и передать ему переменный контекст как

public class JSONTask extends AsyncTask<String,String,List<MovieModel>>{ 
public Context mContext; 

public JSONTask(Context context){ 
    this.mContext = context; 
} 
. 
. 
. 

Теперь создать объект JsonTask от вашей деятельности/услуг в

JSONTask task = new JSONTask(getApplicationContext()); 

и теперь вы можете использовать mContext, где нужно пройти контекст.

0

Первый контекст Провозглашение

Activity context; 

затем

MovieAdapter adapter = new MovieAdapter(context.getApplicationContext(),R.layout.row,result); 
     lvMovies.setAdapter(adapter); 

Я надеюсь, что это полезно для вас ......

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