Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

Android PDFの編集・保存・印刷その後2

すがすがしい顔をしています。まだ朝の内ですので元気な顔をしている柴犬です。

概要

5月4日投稿の「Android PDFの編集・保存・印刷その後」で、プリンタの検索をしましたが、起動するたびに検索するのは無駄ですので、検索結果を保存できないか考えてみました。

WEBのみでは断片的で覚えにくいので最初に購入した Kotlin の本です。

basicData

SharedPreferences を使ってアプリのストレージに保存することにしました。

保存フォルダーのパス   /data/data/[パッケージ名]/shared_prefs/

ファイル名        [コンストラクタの引数 String name].xml

Class を作ってみました。

copy

    private class basicData {
        SharedPreferences _data;
        SharedPreferences.Editor _editor;

        public basicData(String name) {
            _data = getSharedPreferences(name, Context.MODE_PRIVATE);
            _editor = _data.edit();
        }

        public void put(String key, String value) {
            this._editor.putString(key, value);
            this._editor.apply();
        }

        public String get(String key) {
            return this._data.getString(key, "");
        }

        public String remove(String key) {
            String temp = this.get(key);
            this._editor.remove(key);
            return temp;
        }

        public String clear() {
            String temp = this.toJsonString();
            this._editor.clear();
            this.put("プリンタ数","0");
            return temp;
        }

        public Boolean exists(String key) {
            return this._data.getString(key, "nokey") != "nokey";
        }
        
        public SharedPreferences.Editor editor() {
            return _editor;
        }

        public final String toJsonString() {
            JSONObject preferencesJson = new JSONObject();
            Map<String, ?> map = this._data.getAll();
            try {
                for (Map.Entry<String, ?> entry : map.entrySet()) {
                    preferencesJson.put(entry.getKey(), entry.getValue());
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return preferencesJson.toString();
        }

        public final String toString(Context context) {
            return this._data.getAll().toString();
        }

    }

printerSearch

for (Channel channel : channels.getChannels()) {} 周りのところでインスタンスを使いました。

copy

    private void printerSearch() {
        //クラス printerSearchTask の実体を作成
        printerSearchTask backgroundReceiver = new printerSearchTask(this);
        //executorService を作成
        ExecutorService executorService  = Executors.newSingleThreadExecutor();
        //executorService.submit の引数に実体を渡します
        //バックグラウンドで非同期処理が行われ戻り値が future に格納されます
        Future<PrinterSearchResult> future;
        future = executorService.submit(backgroundReceiver);
        PrinterSearchResult channels;
        try {
            //future から channels の配列を取り出します
            channels = future.get();
            if (channels != null) {

                TextView[] tvlist = {findViewById(R.id.textView01),
                        findViewById(R.id.textView02),
                        findViewById(R.id.textView03)};

                String modelname = "";
                String ipaddress = "";
                int i = 0;
                String[] printerList = new String[channels.getChannels().size()];

                bD.clear();
                for (Channel channel : channels.getChannels()) {
                    modelname = channel.getExtraInfo().get(Channel.ExtraInfoKey.ModelName);
                    ipaddress = channel.getChannelInfo();
                    printerList[i] = "プリンタ名: " + modelname + "\n" +
                            "IPアドレス: " + ipaddress;
                    bD.put("プリンタ名_" + i, modelname);
                    bD.put("IPアドレス_" + i, ipaddress);
                    if (i < tvlist.length ) {
                        tvlist[i].setText(printerList[i]);
                    }
                    i += 1;
                }
                bD.put("プリンタ数", String.valueOf(i));

                TextView tv;
                tv = findViewById(R.id.tvText1);
                if (printerList.length > 0) {
                    tv.setText(String.join("\n", printerList));
                } else {
                    tv.setText("使用できるプリンタはありません");
                }
            }
        }
        catch(ExecutionException | InterruptedException ex) {
            Log.w("printerSearch catch", "非同期処理結果の取得で例外発生: ", ex);
        }
        finally {
            Log.d("printerSearch finally", "非同期処理完了");
            executorService.shutdown();
        }
    }

onCreate

copy

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

        ClickListener cl = new ClickListener();
        TextView tv;
        tv = findViewById(R.id.textView01);
        tv.setOnClickListener(cl);
        tv = findViewById(R.id.textView02);
        tv.setOnClickListener(cl);
        tv = findViewById(R.id.textView03);
        tv.setOnClickListener(cl);

        tvTellop1 = findViewById(R.id.tvTellop1);
        tvTellop2 = findViewById(R.id.tvTellop2);
        tvTellop3 = findViewById(R.id.tvTellop3);
        etInput1 = findViewById(R.id.etInput1);
        etInput2 = findViewById(R.id.etInput2);
        etInput3 = findViewById(R.id.etInput3);

        ImageView im = findViewById(R.id.image);
        im.setBackgroundResource(R.drawable.border);

        Button btn;
        btn =findViewById(R.id.button);
        btn.setOnClickListener(cl);
        Log.d("onCreate1","cl");

        // ここでインスタンスを作ります
        bD = new basicData("printerIpAddress");
        // ダミーデータです
        bD.put("プリンタ名_0","model00");
        bD.put("プリンタ名_1","model11");
        bD.put("プリンタ名_2","model22");
        bD.put("IPアドレス_0","111.222.1.1");
        bD.put("IPアドレス_1","111.222.2.2");
        bD.put("IPアドレス_2","111.222.3.3");
        bD.put("プリンタ数","3");
        String temp = bD.toJsonString();
        TextView tvv;
        tvv = findViewById(R.id.tvText1);
        tvv.setText(temp);
        Log.d("onCreate1",temp);

        // プリンタデータがあればそれを表示します
        int printerCount = Integer.valueOf(bD.get("プリンタ数"));
        if (printerCount < 1){
            // 
            printerSearch();
        } else {
            TextView[] tvlist = {findViewById(R.id.textView01),
                    findViewById(R.id.textView02),
                    findViewById(R.id.textView03)};
            int i;
            for (i = 0; i < tvlist.length; i++) {
                if (i < printerCount ) {
                    tvlist[i].setText("プリンタ名: " + bD.get("プリンタ名_" + i) + "\n" +
                            "IPアドレス: " + bD.get("IPアドレス_" + i));
                } else {
                    tvlist[i].setText("");
                }
            }
        }

この件はここまでとします。