在android stuido uisng Java的onPostExecute中,上下文为空?

Context is null in onPostExecute in android stuido uisng Java?

提问人:Tiana 提问时间:11/3/2023 最后编辑:Tiana 更新时间:11/3/2023 访问量:83

问:

我在获取回收器视图以显示文本时遇到问题。我很确定这是因为上下文是空的

主要活动

public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private TextView textView;
private Button button;
//private RecyclerView output2;

@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = (TextView) findViewById(R.id.outputTextView);
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    button = (Button) findViewById(R.id.getItemsButton);
    //make textview scrollable
    textView.setMovementMethod(new ScrollingMovementMethod());

    String s1[] = new String[0];
    /*try {
        s1 = new String[]{new deserializeItem().toString()};
    } catch (IOException | JSONException e) {
        throw new RuntimeException(e);
    }*/

    //recyclerAdapter recyclerAdapter = new recyclerAdapter(this, s1);

    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            try {
                String itemText = new DeserializeItem().toString();
                DeserializeItem di = new DeserializeItem();
                di.execute("temp");
                //output.setText(itemText);
                //output2.setAdapter(recyclerAdapter);

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    });
}

public class DeserializeItem extends AsyncTask<String, String, List<Item>> {
    private Context context;


    @Override
    protected List<Item> doInBackground(String... urls) {
        try {
            String itemText = "";
            String jsonUrl = "json url here";
            Gson gson = new Gson();

            //Reads data from JSON File and converts it to a string
            InputStream is = new URL(jsonUrl).openStream();
            String jsonTxt = IOUtils.toString(is, "UTF-8");
            is.close();

            //Convert json string to array of Item objects
            Item[] items = gson.fromJson(jsonTxt, Item[].class);
            List<Item> itemList = new ArrayList<Item>();

            //Eliminates objects with null and empty item names
            for (int i=0; i<items.length; i++)
            {
                if (items[i].getItemName() == null) {continue;}
                else if (items[i].getItemName().equals("")) {continue;}
                else {itemList.add(items[i]);}
            }

            //Sorts by list ID, then sorts naturally by name
            Comparator<Item> comparator
                    = Comparator.comparing(Item::getListId)
                    .thenComparing(value -> {
                        int indexOf = value.name.indexOf(' ');
                        return Integer.parseInt(value.name.substring(indexOf + 1));
                    });
            Collections.sort(itemList, comparator);
            return itemList;

            //converts items to a string to be returned and displayed.
        /*for (int i=0; i<itemList.size(); i++)
        {
            itemText += itemList.get(i).toString();
        }
        return itemText;*/
        }
        catch(IOException e){
            throw new RuntimeException(e);
            //return "Unable to retrieve web page. URL may be invalid";
        }
    }

    @Override
    protected void onPostExecute(List<Item> itemList)
    {
        //super.onPostExecute(itemList);
        int duration = Toast.LENGTH_SHORT;
        //Toast.makeText((MainActivity)context, "Your Message", Toast.LENGTH_LONG).show();
        String[] itemText = new String[itemList.size()];
        for (int i=0; i<itemList.size(); i++)
        {
            itemText[i] = itemList.get(i).toString();
        }
        if (context != null)
        {
            putDataIntoRecyclerView(itemText);
        }

    /*try
    {
        Gson gson = new Gson();
        JSONObject jsonObject = new JSONObject(jsonText);
        Item[] items = gson.fromJson(jsonText, Item[].class);
    } catch (JSONException e) {
        throw new RuntimeException(e);
    }*/
    }

    void putDataIntoRecyclerView(String[] itemList)
    {
        RecyclerAdapter recyclerAdapter = new RecyclerAdapter((MainActivity) context, itemList);
        recyclerView.setAdapter(recyclerAdapter);
    }
}

recylcerAdapater

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

//String id[], listID[], name[];
String info[];
MainActivity context;
//public recyclerAdapter(Context ct, String s1[], String s2[], String s3[]){
public RecyclerAdapter(MainActivity ct, String[] s1){
    context = ct;
    info = s1;
}

public <deserializeItem> RecyclerAdapter(deserializeItem deserializeItem, String itemText) {
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.recycler_view_item, parent, false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.MyViewHolder holder, int position) {
    holder.textView1.setText(info[position]);
}

@Override
public int getItemCount() {
    return info.length;
}

public class MyViewHolder extends RecyclerView.ViewHolder{
    TextView textView1;
    public MyViewHolder(@NonNull View itemView){
        super(itemView);
        textView1 = itemView.findViewById(R.id.textView1);
    }
}

}

我不确定我是否没有以正确的方式做事,但我无法在程序中显示任何内容。我确实知道,如果我删除

如果 (上下文 != null) { recyclerAdapter recyclerAdapter = new recyclerAdapter((MainActivity) context, itemText); putDataIntoRecyclerView(itemText); }

它会给我一个空指针异常。

如果我的问题没有很好地表达或格式化,请原谅我,我对在 StackOverflow 上提问很陌生。

爪哇岛 人造人 异步 nullpointerexception

评论

0赞 Tiana 11/3/2023
它符合要求,但不显示任何内容。我很确定这是因为 recyclerAdapter recyclerAdapter = new recyclerAdapter(context, itemText) 中的上下文为 null
0赞 Tiana 11/3/2023
不,这是一个单独的类。如果我把它放在 MainActivity 中会有什么不同吗?
0赞 Tiana 11/3/2023
“是的,它为空,因为您没有为变量赋值。为任务添加一个构造函数,并将上下文作为参数。你从哪里称呼任务?我不完全确定你在这里是什么意思?
0赞 Tiana 11/3/2023
好吧,我将 async 放入 mainactivity 中,并试图使代码更具可读性,然后我从 onClick 调用 execute
0赞 blackapps 11/3/2023
是时候告诉我们一切是否按预期工作了。

答:

1赞 AndroidNoob 11/3/2023 #1

更改为应该可以解决此问题。(MainActivity) contextMainActivity.this

我认为即使这解决了问题,这也不是使用上下文的最佳方法。这可能会导致上下文泄漏。

您应该创建一个侦听器,以便将项目从异步任务回调到活动。通过这样做,所有与上下文和回收器视图相关的内容都将按原样驻留在 Activity 中。

例如。

interface DataCallback{
    public void getData(List<Data> data);
}

从异步任务:

listener.getData(data);