提问人:Tiana 提问时间:11/3/2023 最后编辑:Tiana 更新时间:11/3/2023 访问量:83
在android stuido uisng Java的onPostExecute中,上下文为空?
Context is null in onPostExecute in android stuido uisng Java?
问:
我在获取回收器视图以显示文本时遇到问题。我很确定这是因为上下文是空的
主要活动
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 上提问很陌生。
答:
1赞
AndroidNoob
11/3/2023
#1
更改为应该可以解决此问题。(MainActivity) context
MainActivity.this
我认为即使这解决了问题,这也不是使用上下文的最佳方法。这可能会导致上下文泄漏。
您应该创建一个侦听器,以便将项目从异步任务回调到活动。通过这样做,所有与上下文和回收器视图相关的内容都将按原样驻留在 Activity 中。
例如。
interface DataCallback{
public void getData(List<Data> data);
}
从异步任务:
listener.getData(data);
评论