7 Ekim 2015 Çarşamba

#ANDROID - FileOutputStream ile Dosyaya Veri Yazma ve Okuma (AsyncTask ile)

  Hiç yorum yok
Bu makalemizde bir dosyaya veri yazıp bu yazdığımız veriyi okuyacağız. Layout olarak bir önceki makalede SharedPreference uygulamasında kullandığmız dosyayı kullancağız. Çünkü tasarım olarak değişiklik gerektirecek bir şey yok.

Önceki makale: http://www.hcengiz.com/2015/10/android-sharedpreference-ile-veri_7.html

Dediğim gibi daha önce oluşturduğumuz sharedpreference.xml dosyasının yanında yeni olarak InternalData.java adında bir dosya (class) oluşturuyoruz.

sharedpreference.xml dosyası:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/etData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </EditText>

    <Button
        android:id="@+id/bKaydet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Kaydet" />

    <Button
        android:id="@+id/bGetir"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Veri Getir" />

    <TextView
        android:id="@+id/tvSonuclar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="TextView" />

</LinearLayout>

InternalData.java dosyası:

package com.hakancengiz.blogders;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class InternalData extends Activity implements View.OnClickListener {

    Button kaydet, getir;
    EditText kaydedilecekVeri;
    TextView ekranaYaz;
    String DOSYA_ADI = "InternalString";
    FileOutputStream fos;
    FileInputStream fis;

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

        ilkleme();

    }

    private void ilkleme() {
        kaydet = (Button) findViewById(R.id.bKaydet);
        getir = (Button) findViewById(R.id.bGetir);
        kaydedilecekVeri = (EditText) findViewById(R.id.etData);
        ekranaYaz = (TextView) findViewById(R.id.tvSonuclar);

        kaydet.setOnClickListener(this);
        getir.setOnClickListener(this);

        try {
            fos = openFileOutput(DOSYA_ADI, MODE_PRIVATE);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.bKaydet:
                String kaydedilecekData = kaydedilecekVeri.getText().toString();
                try {
                    fos = openFileOutput(DOSYA_ADI, MODE_PRIVATE);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                try {
                    fos.write(kaydedilecekData.getBytes());
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;

            case R.id.bGetir:
                new dosyamiOku().execute(DOSYA_ADI);
                break;
        }
    }

    public class dosyamiOku extends AsyncTask<String, Integer, String>
    {
        protected void OnPreExecute()
        {
            //İşlem başlamadan önce yapılacaklar.
        }

        @Override
        protected String doInBackground(String... params) {
            //İşlemleri yapacak olan kısım.
            String dosyadanOkunanVeri = null;
            try {

                fis = openFileInput(DOSYA_ADI);
                byte[] okunanByteDizisi = new byte[fis.available()];
                while (fis.read(okunanByteDizisi) != -1)
                {
                    dosyadanOkunanVeri = new String(okunanByteDizisi);
                }
                fis.close();
                return dosyadanOkunanVeri;

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        protected void onProgressUpdate()
        {
            //İşlemi güncelleme.
        }

        protected void onPostExecute(String result)
        {
            //İşlem bittikten sonra olacaklar.
            ekranaYaz.setText(result);
        }
    }
}

Burada AsyncTask kullandık. Bu arka planda işlem yaparken kullanıcıya bir bilgi vs. bir şeyler göstermemizi tabiri caiz ise kullanıcıyı oyalamamızı sağlıyor.

  • onPreExecute() : AsyncTask ile yapılmasını istedğimiz arkaplan işlemi başlamadan bu metod çağrılır. Set işlemlerini gerçekleştirmek için en uygun metottur.
  • doInBackground(Params… params) : onPreExecute() metodundan hemen sonra çalışır. Arkaplan işleminin yapıldığı kısımdır. Bu metod içine uzun süreceğini düşündüğümüz işlemleri kodlarız. Arkaplan işlemi bitince onPostExecute() metodu çağrılır.
  • onPostExecute(Result result) : doInBackground() da yapılan işlem biter bitmez çağrılır. Arkaplan işleminin döndüğü değerleri handle ettiğimiz yerdir. ProgressDialog gibi bilgilendirme ekranları, bu metod içinde dismiss edilir.
  • onProgressUpdate() : Yapılan işlemin ilerleyişi hakkında bilgi verir
Son olarak activitymizi AndroidManifest.xml dosyasında tanıtmayı unutmayalım.

Makale görseli:

Hiç yorum yok :

Yorum Gönder