有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

NetworkOnMainThreadException Android/Java

我知道有一些相同的问题,但我就是不知道我做错了什么

public class MainActivity extends AppCompatActivity {
...
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       ...
       new JsonHandler().execute(this, collection, gridArray, customGridAdapter);
       ...
   }
}

所以在我的主要活动中,我需要查询一个返回JSON的API,我必须处理它来构建我的数据库

然后在doInBackground()中调用getAllCards(),它获取第一个JSON。因为JSON包含用于更多JSON请求的URL,所以我有几个方法,每个方法都查询更详细的JSON

public final class JsonHandler extends AsyncTask {
private final String urlCards = "https://api.gwentapi.com/v0/cards/";
private final String urlSpecificCard = "https://api.gwentapi.com/v0/cards/:id";

private Context context;
private Collection collection;
private ArrayList<Card> gridArray;
private CustomGridViewAdapter customGridAdapter;

public JsonHandler(Context context, Collection collection, ArrayList<Card> gridArray, CustomGridViewAdapter customGridAdapter){
    this.context = context;
    this.collection = collection;
    this.gridArray = gridArray;
    this.customGridAdapter = customGridAdapter;
}

public JsonHandler(){
    this.context = null;
    this.collection = null;
    this.gridArray = null;
    this.customGridAdapter = null;
}

private void getAllCards() throws RuntimeException {
    JsonObjectRequest arrayRequest = new JsonObjectRequest(Request.Method.GET, urlCards, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            generateCollection(response);
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError e) {
            throw new RuntimeException(e.getMessage());
        }
    });

    Volley.newRequestQueue(context).add(arrayRequest);
}

private void getSpecificCard(final String cardURL) throws RuntimeException {
    JsonObjectRequest arrayRequest = new JsonObjectRequest(Request.Method.GET, cardURL, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            processCard(response, collection);
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError e) {
            throw new RuntimeException(e.getMessage());
        }
    });

    Volley.newRequestQueue(context).add(arrayRequest);
}

private void generateCollection(JSONObject response) throws RuntimeException {
    try {
        JSONArray array = response.getJSONArray("results");
        for(int i = 0; i < array.length();i++){
            JSONObject object = array.getJSONObject(i);
            String cardURL = object.getString("href");
            getSpecificCard(cardURL);
        }
    } catch (Exception e) {
        throw new RuntimeException(e.getMessage());
    }
}

private void processCard(JSONObject response, Collection collection){
    try {
        String id = response.getString("id");
        EnumFaction faction = EnumFaction.valueOf(response.getJSONObject("faction").getString("name").toUpperCase());
        EnumType type = null;
        EnumRarity rarity = null;
        EnumLane lane = null;
        EnumLoyalty loyalty = null;
        String name = response.getString("name");
        String text = response.getString("text");
        String imagePath = "https://api.gwentapi.com/media/\" + id + \"_small.png";

        URL url = new URL(imagePath);
        InputStream inputStream = url.openConnection().getInputStream();
        Bitmap image = BitmapFactory.decodeStream(inputStream);

        Card card = new Card(id, faction, type, rarity, lane, loyalty, name, text, null, imagePath, 0);
        collection.addCard(card);
        gridArray.add(card);
        customGridAdapter.notifyDataSetChanged();
    } catch (Exception e){
        throw new RuntimeException(e.getMessage());
    }
}

@Override
protected Object doInBackground(Object[] params) {
    context = (Context) params[0];
    collection = (Collection) params[1];
    gridArray = (ArrayList<Card>) params[2];
    customGridAdapter = (CustomGridViewAdapter) params[3];
    getAllCards();
    return null;
}

}

那么现在来谈谈问题:

当程序在收集了足够的信息后到达processCard()时,在创建InputStream时会出现NetworkOnMainThreadException

我尝试了很多不同的方法从我的URL获取位图,以及不同的方法来执行异步任务——所有这些都会导致相同的结果

如果你能告诉我如何解决这个问题,我会很高兴的

编辑:因为它被标记为重复:我正在使用ASYNCTASK!我看了很多问题,并尝试了他们在那里做的事情,但都不起作用


共 (1) 个答案

  1. # 1 楼答案

    不太熟悉截击是如何工作的,但是onResponse但是要在主线程上,所以你也需要启动一个新线程来进行调用