2013-03-29 3 views
2

У меня есть проблема с создать отдельный класс в Jave У меня есть эта часть кодаПреобразование Pice кода класса

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_NAME и R.id.list_poet_namecolumns и ..) Я думаю, что повторение этого кода не является профессиональным способом, поэтому я хочу преобразовать его в отдельный класс, и в каждом действии я его использую Но я не знаю, как это сделать .. (Я пытался, но всегда получаю ошибку, например, я не знаю, как определить контекст для SimpleCursorAdapter или сделать T Oast работа здесь вы можете мне помочь, как преобразовать этот код в отдельный класс

Вот мой код класса

и когда я хочу, чтобы использовать его я использую эти коды

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 
+0

Вы звоните неправильный инициализатор для get_data. Используйте этот код (при условии, что вы звоните из своей деятельности: Get_data poet_name = new Get_data (this); – HalR

+0

Спасибо моему другу, но я все еще получаю ошибку. Я прикрепил код logcat..Я думаю, что у моего класса проблемы. Я прав ? – Majid

+0

Похоже, у вас возникли проблемы с инициализацией вашей деятельности. Вам нужно отладить вашу инициализацию.Помимо всего прочего, этот код никогда не выполняется: public Get_data() { TABLE_NAME = "classicpoems__poet_header"; COLUMN_ID = "_ id"; COLUMN_NAME = "poet_name"; } , потому что вы не вызываете этот метод, а тот, который находится над ним при запуске приложения. – HalR

ответ

1

Вы должны сделать отдельный класс в своем собственном файле. Сделайте его общедоступным, чтобы другие классы могли его увидеть и дать ему некоторые параметры создания.

Передача вызывающей активности классу, тогда вы можете использовать это значение для вызовов, таких как тост, для которых требуется текущее действие.

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

    } 
} 
+0

Спасибо за вашу помощь .. Я использовал подрядчика и сейчас Я могу использовать текущую активность ... Но у меня есть две проблемы: первая функция findViewById не определена и вторая Если я хочу изменить 'String [] columns' из своей активности, как я могу ее определить? Могу ли я создать новый метод в doInBackground методе ? – Majid

+0

Если вы передаете действие своему классу, вы можете использовать callActivity.findViewById() – HalR

+0

Вы также можете добавить параметр String [] к вашему созданию своего класса – HalR

0

(я надеюсь, что я правильно понял ваш вопрос.) Вот что я хотел бы предложить:

Создайте отдельный класс из приведенного выше кода с помощью конструктора, имеющего тип SimpleCursorAdapter в качестве параметра. Создайте объект Read_from_db с SimpleCursorAdapter со значениями таблиц и столбцов по вашему желанию и используйте их в методе doInBackground.

+0

Спасибо за вашу помощь, но жаль, что я не получил вашего зла .. :(вы можете объяснить немного больше :), спасибо – Majid

0

Вы можете создать конструктор в классе AsyncTask где бы скоротать контекст:

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

Контекст CTX является глобальной переменной класса, и вы можете использовать его вместо Read.this

+0

Спасибо, дорогой друг, теперь я могу использовать контекст – Majid

0

Просто сделать застройщик из пользовательского класса, как это:

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

} 
} 
+0

Спасибо, я исправил свою первую проблему, но теперь у меня проблема с 'findviewbyid', которая не определена :( – Majid

+0

Щелкните правой кнопкой мыши свой проект и щелкните ** Build Project **. Это должно решить проблему. – captaindroid

+0

Спасибо, я исправил эту проблему, но у меня есть некоторые проблемы с моим классом ... Можете ли вы снова взглянуть на первое сообщение? Я добавил несколько журналов там. Может быть, вы можете помочь мне в моей новой проблеме. Спасибо. – Majid

Смежные вопросы