无法解析方法getApplicationContext()

8

这是我从互联网上获取的代码,我需要用它来制作自己的应用程序。我正在使用示例创建一个应用程序。不同之处在于,我为此创建了一个名为JSONTask的单独类。我在使用getApplicationContex()函数时遇到了错误。请帮我解决。

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
}

}


可能是 https://dev59.com/nmUp5IYBdhLWcg3wbnMS 的重复问题。 - Sathish Kumar J
1
getApplicationContext()Context的一个公共函数。您需要一个从Context派生的对象,例如ActivityBroadcastReceiverService - 0xDEADC0DE
4个回答

13

问题在于你正在一个不扩展Context或其子类(Activity等)的类中调用getApplicationContext()。你应该将Context或其子类传递给JSONTask构造函数。此外,我没有看到你初始化lvMovies——你很可能会在lvMovies.setAdapter(adapter);处得到NullPointerException——我的建议是你也应该将它传递给你的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);

我希望这有所帮助。


你的ContextListView应该使用WeakReference,以避免持有依赖于发送的上下文的活动。此外,在任务完成之前,你的列表可能会被回收,然后泄漏整个与ListView相关联的活动。 - JBirdVegas

2

首先声明上下文,

Activity context;

那么

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

我希望这对你有所帮助......


1
你不能从AsyncTask中访问getApplicationContext(),因为getApplicationContext()在AsyncTask中不存在。创建一个构造函数并将Context传递给此类,在JSONTask类中使用它。建议您使用Volley库而不是AsyncTask。

0
创建一个构造函数并传递一个Context变量,例如:
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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接