2

Существует 2 класса и 1 интерфейс: класс 1 = LoginPage, класс 2 = SyncData и интерфейс = AsyncTaskCompleteListener.NullpointerException при использовании функции обратного вызова в AsyncTask

В классе 1 используется класс 2 для синхронизации информации с сервером. После того, как класс 2 отправляет информацию о результатах в метод onPostExecute, метод обратного вызова интерфейса будет использоваться для отправки информации о результатах в класс 1. Когда я пытаюсь использовать метод обратного вызова, я вижу следующую ошибку:

04-12 11:06:43.715: W/dalvikvm(24941): threadid=1: thread exiting with uncaught exception (group=0x4001e578) 
04-12 11:06:43.720: E/AndroidRuntime(24941): FATAL EXCEPTION: main 
04-12 11:06:43.720: E/AndroidRuntime(24941): java.lang.NullPointerException 
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.on_d_mand.live_evenementen.SyncData.onPostExecute(SyncData.java:101) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.on_d_mand.live_evenementen.SyncData.onPostExecute(SyncData.java:1) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.AsyncTask.finish(AsyncTask.java:417) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.AsyncTask.access$300(AsyncTask.java:127) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.os.Looper.loop(Looper.java:130) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at android.app.ActivityThread.main(ActivityThread.java:3691) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at java.lang.reflect.Method.invokeNative(Native Method) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at java.lang.reflect.Method.invoke(Method.java:507) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 
04-12 11:06:43.720: E/AndroidRuntime(24941): at dalvik.system.NativeStart.main(Native Method) 

Класс 1 onTaskComplete метод выборки:

public void onTaskComplete(String result) { 
    //perform action after receiving the information 
    Toast.makeText(this, result, Toast.LENGTH_LONG).show(); 
} 

Класс 2 onPostExecute образца метод:

public void onPostExecute(String RESULT) { 

    if(dialog.isShowing()){ 
     dialog.dismiss(); 
    } 

    callback.onTaskComplete(RESULT); 

} 

Класс 3:

package com.on_d_mand.live_evenementen; 

public interface AsyncTaskCompleteListener<T> { 
    public void onTaskComplete(T result); 
} 

Кто-нибудь знает, что я здесь делаю неправильно? Надеюсь, это не слишком сложно с классами и интерфейсом.

Редактировать

Решения этой проблемы был с помощью инициализации объекта обратного вызова в классе 2 застройщика.

+0

Можете ли вы опубликовать код, в котором вы инициализируете поле «обратного вызова» вашей AsyncTask? Мое подозрение в том, что это либо не выполняется, либо делается слишком поздно (например, после запуска задачи). – Jules

+0

По какой-то причине я не могу инициализировать обратный вызов.Когда я пытаюсь его инициализировать, я вижу следующее сообщение об ошибке: Не удается создать экземпляр типа AsyncTaskCompleteListener Xarialon

+0

Можете ли вы опубликовать код, который вы используете, когда пытаетесь его инициализировать? – Jules

ответ

3

Вам нужно передать ссылку на объект, который реализует свой слушатель в классе «» SyncData при ее создании. Предположительно, в данный момент в вашем LoginPage у вас есть что-то, что выглядит следующим образом:

new SyncData().execute(); 

Вы должны изменить это:

new SyncData(this).execute(); 

И добавить конструктор к SyncData:

public SyncData(AsyncTaskCompleteListener<String> callback) 
{ 
     this.callback = callback; 
} 

Если у вас уже есть конструктор для SyncData, вам нужно будет добавить аргумент и код в существующий конструктор.

+0

Большое спасибо! Я не знал, как его инициализировать ... Это было действительно глупо, но ваш код помог! – Xarialon

+0

Я также новичок в Java и задавался вопросом, как callback знает, какой метод onTaskComplete он должен запускать. Существует еще один хороший ответ о AsyncTasks и слушателях, но этой части информации не было http://stackoverflow.com/questions/3291490/common-class-for-asynctask-in-android. И теперь, когда я снова это ищу. В этом ответе также содержится информация. Плохое чтение от меня. – Mika

2

Это может быть возможно, что вы диалог объект получает null так вместо

if(dialog.isShowing()){ 
     dialog.dismiss(); 

попробовать

if(dialog!=null){ 
     dialog.dismiss(); 
+0

Нет, это не помогло. Это должен быть метод обратного вызова. – Xarialon

1
public void onPostExecute(String RESULT) { 

     if(dialog.isShowing()){ 
      dialog.dismiss(); 
     } 

     callback.onTaskComplete(RESULT); //make sure callback is not null 

// and proper null check is required in onTaskComplete in case RESULT is null 

    } 
+0

Я не могу инициировать обратный вызов. Я попробовал: callback = new AsyncTaskCompleteListener (); но я вижу: Невозможно создать экземпляр типа AsyncTaskCompleteListener Xarialon

+0

@Xonarial .. is ** AsyncTaskCompleteListener ** класс или интерфейс ..? – ngesh

+0

Это интерфейс. – Xarialon

0

Либо диалог является недействительным или обратного вызова равна нулю.

Посмотрите на номер строки, и вы узнаете, что это такое.

0

попробуйте этот код :::

public void onTaskComplete(String result) { 
     runOnUiThread(new Runnable() {   
      public void run() { 
       // TODO Auto-generated method stub 
       //perform action after receiving the information 
       Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
      } 
     }); 
     } 
+0

Это не то, что я хочу, мне нужно использовать интерфейс обратного вызова, чтобы продолжить то, что я хочу. :) – Xarialon

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