使用 AsyncTask 从 URL 获取数据到数组列表中

Posted

技术标签:

【中文标题】使用 AsyncTask 从 URL 获取数据到数组列表中【英文标题】:Fetching data from URL into an array-list with AsyncTask 【发布时间】:2020-10-01 00:06:40 【问题描述】:

下面列出的原始代码有效,它将显示 7, california, 昨天以两行单独的行和我从网站获取的标题,当我尝试将标题添加到任何 ArrayLists 时出现问题,例如这个:

            try 
                JSONObject json = new JSONObject(s);

                String title = json.getJSONObject("metadata").getString("title");
                text.setText(title);

                magnitude.add(title);

             catch (JSONException e) 
                e.printStackTrace();
            

这会给我一个错误:java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 我不知道为什么。有什么解决办法吗?

原始代码:

public class MainActivity extends AppCompatActivity 


    ArrayList<String> magnitude;
    ArrayList<String> place;
    ArrayList<String> time;
    TextView text;


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

        text = findViewById(R.id.textView);
        magnitude = new ArrayList<>();
        place = new ArrayList<>();
        time = new ArrayList<>();

        getJson json = new getJson();
        String result = "";

        try 
            result = json.execute("https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&eventtype=earthquake&orderby=time&minmag=6&limit=10").get();
         catch (InterruptedException e) 
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
         catch (ExecutionException e) 
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
        
    




    public void initRecycleView() 
        RecyclerView recycler = findViewById(R.id.list);
        recyclerAdapter adapter = new recyclerAdapter(MainActivity.this, magnitude, place, time);
        recycler.setAdapter(adapter);
        recycler.setLayoutManager(new LinearLayoutManager(MainActivity.this));

    


    public class getJson extends AsyncTask<String, Void, String> 

        @Override
        protected void onPostExecute(String s) 
            super.onPostExecute(s);

            magnitude.add("7");
            place.add("California");
            time.add("yesterday");

            try 
                JSONObject json = new JSONObject(s);

                String title = json.getJSONObject("metadata").getString("title");
                text.setText(title);


             catch (JSONException e) 
                e.printStackTrace();
            

            magnitude.add("7");
            place.add("California");
            time.add("yesterday");



            initRecycleView();
        

        @Override
        protected String doInBackground(String... strings) 


            String result = "";
            URL url;
            HttpURLConnection connection = null;

            try 
                url = new URL(strings[0]);
                connection = (HttpURLConnection) url.openConnection();
                InputStream in = connection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);
                int data = reader.read();

                while(data != -1) 
                    char character = (char) data;
                    result += character;

                    data = reader.read();
                
                return result;
             catch (MalformedURLException e) 
                e.printStackTrace();
                return "";
             catch (IOException e) 
                e.printStackTrace();
                return "";
            
        

    

【问题讨论】:

【参考方案1】:

您的代码工作正常.. 可能是来自其他地方的错误。可能来自你没有提到的 RecyclerAdapter.. 查看 @覆盖 公共 int getItemCount() 返回0; // 数组列表的大小

也许您使用的值比 arraylist 包含的更多。

【讨论】:

以上是关于使用 AsyncTask 从 URL 获取数据到数组列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 asyncTask 方法解析来自 2 个不同 URL 的数据

从 AsyncTask 返回数据到 MainActivity 的最佳方法

用于图像获取的AsyncTask不断被调用

如何将变量从 AsyncTask 返回到 Android 中的 Google Map 活动

创建多个 AsyncTask

如何从静态ASyncTask获取当前显示的活动?