Majid
Majid

Reputation: 230

Convert a pice of code to class

I have a problem with create a separate class in jave I have this part of code

private class Read_from_db extends AsyncTask <String, Long, Void> {
    private final ProgressDialog dialog = new ProgressDialog(Read.this);
    // can use UI thread here
    protected void onPreExecute() {
    this.dialog.setMessage("Wait\nSome SLOW job is being done...");
    this.dialog.show();
    }
    @Override
    protected Void doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        try {
            //txtMsg.append("\n");
            // obtain a list of from DB
                String TABLE_NAME = "classicpoems__poet_header";
                String COLUMN_ID = "_id";
             //   String _ID = "_id";
                String COLUMN_NAME = "poet_name";
                String COLUMN_CENTURY = "century_start";
                String [] columns ={COLUMN_ID,COLUMN_NAME,COLUMN_CENTURY};

            Cursor c = db.query(TABLE_NAME,columns,null, null, null, null, COLUMN_ID);
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(Read.this, R.layout.list_item, c, 
                       new String[] {COLUMN_ID,COLUMN_NAME,COLUMN_CENTURY}, new int[] {R.id.list_item_text_id,R.id.list_item_text_main,R.id.list_item_text_sub}, 0);

            ListView list = (ListView) findViewById(R.id.list_poet_name);
            list.setAdapter(adapter);

            } catch (Exception e) {
                //Toast.makeText(Read.this, e.getMessage(), 1).show();
                Log.i(TAG,  e.getMessage());
            }
        db.close();
        return null;
    }
    // can use UI thread here
    protected void onPostExecute(final Void unused) {
    if (this.dialog.isShowing()) {
    this.dialog.dismiss();
    }
    // cleaning-up, all done
    this.dialog.setMessage("Done");

    }
}

That must repeat each time an activity loads (but with some changes for example TABLE_NAME and R.id.list_poet_name columns and ..) I think repeating this code is not a professional way so I want to convert this to a separate class and in each activity I use it But I don't know how to do it..(I tried but I always get error for example I don't know how to define context for SimpleCursorAdapter or make Toast work here can you help me how to convert this code to a separate class

Here Is my class code

   package co.tosca.persianpoem;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class Get_data extends AsyncTask<String, Long, Void> {
//Context context;
public String TABLE_NAME;
public String COLUMN_ID;
public String COLUMN_NAME;
public String COLUMN_CENTURY;
public String[] columns;
public int target;
private String DATABASE_NAME;
private static final String  SDcardPath = Environment.getExternalStorageDirectory().getPath();
private String DbPath = SDcardPath + "/Tosca/" + DATABASE_NAME;
private static final String TAG ="DatabaseHelper";
private SQLiteDatabase db;
private ProgressDialog dialog;
private Activity callingActivity;
public int adapter_list;

//public Get_data(Context context){
  //  this.context=context;
  //  DATABASE_NAME="persian_poem.db";
//}


public Get_data(Activity activity) {
    callingActivity = activity;
}
public Get_data() {
    TABLE_NAME="classicpoems__poet_header";
    COLUMN_ID="_id";
    COLUMN_NAME = "poet_name";

}


@Override
protected void onPreExecute() {

    this.dialog.setMessage("Wait\nSome SLOW job is being done...");
    this.dialog.show();
}



@Override
protected Void doInBackground(String... arg0) {
    // TODO Auto-generated method stub
    try {
        // obtain a list of from DB
        //    String TABLE_NAME = "classicpoems__poet_header";
         //   String COLUMN_ID = "_id";
         //   String _ID = "_id";
         //   String COLUMN_NAME = "poet_name";
         //   String COLUMN_CENTURY = "century_start";
          //  String [] columns ={COLUMN_ID,COLUMN_NAME,COLUMN_CENTURY};

        Cursor c = db.query(TABLE_NAME,columns,null, null, null, null, COLUMN_ID);
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(callingActivity, adapter_list, c, 
                   new String[] {COLUMN_ID,COLUMN_NAME,COLUMN_CENTURY}, new int[] {R.id.list_item_text_id,R.id.list_item_text_main,R.id.list_item_text_sub}, 0);


        ListView list = (ListView)callingActivity.findViewById(target);
        list.setAdapter(adapter);

        } catch (Exception e) {
            Toast.makeText(callingActivity, e.getMessage(), 1).show();
            Log.i(TAG,  e.getMessage());
        }
    db.close();

    return null;
}


protected void onPostExecute(final Void unused) {
    dialog.dismiss();

}
}

and when I want to use it I use this codes

enter code here Get_data poet_name=new Get_data();
        poet_name.TABLE_NAME="classicpoems__poet_header";
        poet_name.COLUMN_ID = "_id";
        poet_name.COLUMN_NAME = "poet_name";
        poet_name.COLUMN_CENTURY = "century_start";
        poet_name.columns =new String[]{"_id","poet_name","century_start"};
        poet_name.adapter_list=R.layout.list_item;
        poet_name.target=R.id.list_poet_name;
        poet_name.execute();

But I get error ..Can you help me to find my mistakes?

I changed initial code to Get_data poet_name=new Get_data(this); but I am getting error yet here is part of logcat

01-06 04:25:32.262: E/AndroidRuntime(3244): FATAL EXCEPTION: main
01-06 04:25:32.262: E/AndroidRuntime(3244): java.lang.RuntimeException: Unable to start activity ComponentInfo{co.tosca.persianpoem/co.tosca.persianpoem.Read}: java.lang.NullPointerException
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.os.Looper.loop(Looper.java:137)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.ActivityThread.main(ActivityThread.java:4441)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at java.lang.reflect.Method.invokeNative(Native Method)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at java.lang.reflect.Method.invoke(Method.java:511)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at dalvik.system.NativeStart.main(Native Method)
01-06 04:25:32.262: E/AndroidRuntime(3244): Caused by: java.lang.NullPointerException
01-06 04:25:32.262: E/AndroidRuntime(3244):     at co.tosca.persianpoem.Get_data.onPreExecute(Get_data.java:54)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.os.AsyncTask.execute(AsyncTask.java:511)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at co.tosca.persianpoem.Read.onCreate(Read.java:65)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.Activity.performCreate(Activity.java:4465)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-06 04:25:32.262: E/AndroidRuntime(3244):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
01-06 04:25:32.262: E/AndroidRuntime(3244):     ... 11 more

Upvotes: 2

Views: 158

Answers (4)

captaindroid
captaindroid

Reputation: 2938

Simply make contructor of your custom class like this:

public class Read_from_db extends AsyncTask<String, Long, Void> {
Context context;
private ProgressDialog dialog;

public Read_from_db(Context context){
    this.context=context;

}

@Override
protected void onPreExecute() {
    dialog = ProgressDialog.show(context, "dialog title", "dialog message.....");
}



@Override
protected Void doInBackground(String... arg0) {
    // TODO Auto-generated method stub

    //do your work here


    return null;
}


protected void onPostExecute(final Void unused) {
    dialog.dismiss();

}
}

Upvotes: 0

HalR
HalR

Reputation: 11083

You should make a separate class in its own file. Make it public, so other classes can see it, and give it some creation parameters.

Pass the calling Activity to the class, then you can use that value for calls like toast that require the current Activity.

public class Read_from_db extends AsyncTask <String, Long, Void> {
    private final ProgressDialog dialog = new ProgressDialog(Read.this);
    private Activity callingActivity;
    public Read_from_db(Activity activity) {
        callingActivity = activity;
    }


    // can use UI thread here
    protected void onPreExecute() {
    this.dialog.setMessage("Wait\nSome SLOW job is being done...");
    this.dialog.show();
    }
    @Override
    protected Void doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        try {
            //txtMsg.append("\n");
            // obtain a list of from DB
                String TABLE_NAME = "classicpoems__poet_header";
                String COLUMN_ID = "_id";
             //   String _ID = "_id";
                String COLUMN_NAME = "poet_name";
                String COLUMN_CENTURY = "century_start";
                String [] columns ={COLUMN_ID,COLUMN_NAME,COLUMN_CENTURY};

            Cursor c = db.query(TABLE_NAME,columns,null, null, null, null, COLUMN_ID);
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(Read.this, R.layout.list_item, c, 
                       new String[] {COLUMN_ID,COLUMN_NAME,COLUMN_CENTURY}, new int[] {R.id.list_item_text_id,R.id.list_item_text_main,R.id.list_item_text_sub}, 0);

            ListView list = (ListView) findViewById(R.id.list_poet_name);
            list.setAdapter(adapter);

            } catch (Exception e) {
                Toast.makeText(callingActivity, e.getMessage(), 1).show();
                Log.i(TAG,  e.getMessage());
            }
        db.close();
        return null;
    }
    // can use UI thread here
    protected void onPostExecute(final Void unused) {
    if (this.dialog.isShowing()) {
    this.dialog.dismiss();
    }
    // cleaning-up, all done
    this.dialog.setMessage("Done");

    }
}

Upvotes: 1

Bojan Ilievski
Bojan Ilievski

Reputation: 1421

You can create a constructor in the AsyncTask class where you would pass the Context:

Context ctx;
public Read_from_db(Context ctx) {
    this.ctx = ctx;
}

Context ctx is a global class variable, and you can use it in place of Read.this

Upvotes: 0

Ajay
Ajay

Reputation: 116

(I hope I understood your issue correctly.) Here is what I would suggest:

Create a separate class from the code above with a constructor having SimpleCursorAdapter type as parameter. Create Read_from_db object with SimpleCursorAdapter having table and column values as you wish and use the same in doInBackground method.

Upvotes: 0

Related Questions