RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 741083
Accepted
Вячеслав
Вячеслав
Asked:2020-11-07 00:44:16 +0000 UTC2020-11-07 00:44:16 +0000 UTC 2020-11-07 00:44:16 +0000 UTC

为什么 ArrayList 会将其值重置为零?

  • 772

有一个方法 initData(urisImg) 应该创建一个 Cover 对象列表。输入是一个ArrayList urisImg,在onCreate方法中初始化,每次通过FileLoader()方法加载文件时填充值。我不明白为什么上传文件后我的 urisImg 列表大小变为零。也就是initData方法没有开始工作,因为urisImg列表是空的……请帮我找出错误。下面的代码

import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;

import com.thin.downloadmanager.DownloadRequest;
import com.thin.downloadmanager.ThinDownloadManager;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private String filename;
    private String fileUrl;
    private ArrayList<Uri> urisImg;
    private ArrayList<String> urls;

    private static final String LOG_TAG = "my_log";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        LinearLayoutManager llm = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(llm);
        recyclerView.setHasFixedSize(true);

        urisImg = new ArrayList<>();

        File file = new File(this.getCacheDir().getPath() + File.separator + "booklist.json");

        if (!file.exists()){
            new ParseBookCovers().execute();
        }
        else {
            CoverFormer(); //посмотреть потом, будет ли успевать выполнять код при большом количестве обложек
        }

        initializeAdapter();

    }

    private List<Cover> initData(ArrayList<Uri> urisImg) {
        ArrayList<Cover> covers = new ArrayList<>();
        for (int i=0; i<urisImg.size();i++){
            covers.add(new Cover(urisImg.get(i)));
        }
        return covers;
    }

    private void initializeAdapter() {
        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(initData(urisImg));
        recyclerView.setAdapter(recyclerAdapter);
    }

    private void FileLoader(String fileUrl, String filename) {

        ThinDownloadManager downloadManager = new ThinDownloadManager(5); //количество потоков загрузки
        Uri downloadUri = Uri.parse(fileUrl);
        Uri destinationUri = Uri.parse(filename);
        DownloadRequest downloadRequest = new DownloadRequest(downloadUri).setDestinationURI(destinationUri);
        downloadManager.add(downloadRequest);
        urisImg.add(destinationUri);

    }

    private class ParseBookCovers extends AsyncTask<Void, Void, String> {

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        String resultJson = "";

        @Override
        protected String doInBackground(Void... params) {
            // получаем данные с внешнего ресурса
            try {
                URL url = new URL("http://******.ru/todbook/booklist.json");

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                resultJson = buffer.toString();
                MyJSON.saveData(getApplicationContext(), resultJson);


            } catch (Exception e) {
                e.printStackTrace();
            }
            return resultJson;
        }

        @Override
        protected void onPostExecute(String strJson) {
            CoverFormer();

        }
    }

    private ArrayList<String> GetListUrlCovers(String strJson) {

        JSONObject dataJsonObj;

        ArrayList<String> urls = new ArrayList<>();

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray books = dataJsonObj.getJSONArray("books");

            for (int i = 0; i < books.length(); i++) {
                JSONObject book = books.getJSONObject(i);
                String url_book = book.getString("coverUrl");
                urls.add(url_book);// пишу урлы в ArrayList urls
                Log.d(LOG_TAG, "coverUrl: " + url_book);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return urls;
    }

    private void CoverFormer(){
        MyJSON.getData(getApplicationContext()); //read file json
        urls = GetListUrlCovers(MyJSON.getData(getApplicationContext())); // parse urls + write to array

        for (int i = 0; i < urls.size(); i++) {
            int d = i + 1;
            fileUrl = urls.get(i);
            filename = this.getFilesDir() + File.separator + "bookcover_" + d + ".jpg";
            FileLoader(fileUrl, filename);
        }
    }

}
android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Eugene Krivenja
    2020-11-07T00:53:37Z2020-11-07T00:53:37Z

    什么时候能满?

    这是一个异步操作,需要时间来完成。

    new ParseBookCovers().execute();
    

    在它启动后,您希望在适配器中看到结果。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5