Reputation: 230
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
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
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
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
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