【问题标题】:Convert a pice of code to class将一段代码转换为类
【发布时间】:2013-03-29 11:51:49
【问题描述】:

我在 java 中创建一个单独的类时遇到问题 我有这部分代码

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");

    }
}

每次加载活动时都必须重复(但有一些更改,例如 TABLE_NAMER.id.list_poet_name columns 和 ..) 我认为重复此代码不是专业的方式,因此我想将其转换为单独的类,并在每个活动中使用它 但我不知道该怎么做..(我试过但总是出错,例如我不知道如何为SimpleCursorAdapter 定义上下文 或者让 Toast 在这里工作你能帮我把这段代码转换成一个单独的类吗

这是我的课程代码

   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();

}
}

当我想使用它时,我会使用此代码

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();

但是我得到了错误..你能帮我找出我的错误吗?

我将初始代码更改为Get_data poet_name=new Get_data(this);,但出现错误,但这里是 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

【问题讨论】:

  • 您为 Get_data 调用了错误的初始化程序。使用此代码(假设您从活动中调用:Get_data potent_name=new Get_data(this);
  • 谢谢我的朋友,但我仍然收到错误..我附加了 logcat 代码..我认为我的班级有问题..我对吗?
  • 您在初始化活动时似乎遇到了问题。您需要调试初始化。除其他外,此代码永远不会执行: public Get_data() { TABLE_NAME="classicpoems__poet_header"; COLUMN_ID="_id"; COLUMN_NAME = "诗人名"; } 因为您不是在调用该方法,而是在启动应用程序时调用它上面的方法。
  • 我试图清理我的所有代码并在 doin 后台方法中替换一个简单的 cod,但我仍然得到错误..我做错了..调用类或整个类是错误的?跨度>

标签: java android class


【解决方案1】:

您应该在自己的文件中创建一个单独的类。将其公开,以便其他类可以看到它,并为其提供一些创建参数。

将调用 Activity 传递给类,然后您可以将该值用于需要当前 Activity 的调用,例如 toast。

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");

    }
}

【讨论】:

  • 感谢您的帮助..我使用了承包商,现在我可以使用当前的活动...但是我有两个问题首先 findViewById 未定义,其次如果我想从我的活动我如何定义它?我可以在 doInBackground 方法中创建一个新方法吗?
  • 如果你将一个活动传递给你的类,你可以使用callingActivity.findViewById()
  • 您还可以在创建类时添加 String[] 参数
  • 谢谢老兄...我修复了这个错误,但我还不能使用它...我添加了我的班级来发布...你能锁定它并告诉我我的错误吗?
  • 谢谢我的朋友,但我仍然收到错误..我附加了 logcat 代码..我认为我的班级有问题..我对吗?
【解决方案2】:

(希望我正确理解了您的问题。) 以下是我的建议:

使用具有 SimpleCursorAdapter 类型作为参数的构造函数从上面的代码中创建一个单独的类。创建 Read_from_db 对象,SimpleCursorAdapter 具有您希望的表和列值,并在 doInBackground 方法中使用相同的值。

【讨论】:

  • 感谢您的帮助,但很抱歉我没有理解您的意思..:(您能再解释一下吗:),谢谢
【解决方案3】:

您可以在 AsyncTask 类中创建一个构造函数,您将在其中传递上下文:

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

Context ctx 是一个全局类变量,你可以用它来代替Read.this

【讨论】:

  • 谢谢亲爱的朋友,现在我可以使用上下文了
【解决方案4】:

像这样简单地构造你的自定义类:

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();

}
}

【讨论】:

  • 谢谢我解决了我的第一个问题,但现在我遇到了findviewbyid 未定义的问题:(
  • 右键单击您的项目,然后单击构建项目。这应该可以解决问题。
  • 谢谢,我解决了这个问题,但我的课有些问题。你能再看看第一篇文章吗?我在那里添加了一些日志。也许你可以帮助我解决我的新问题。 .谢谢
  • 按照我或@HaIR 提到的那样编写你的异步类,你必须从new Get_data(this).execute();等活动中调用这个类
  • 感谢您的帮助..首先我必须定义我的变量然后使用该代码?因为我想定义 table_name 和..我的班级使用这些变量并从数据库中获取数据..
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多