2

2 つのクラスと 1 つのインターフェイスがあります。クラス 1 = LoginPage、クラス 2 = SyncData、インターフェイス = AsyncTaskCompleteListener です。

クラス 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 コンストラクターでコールバック オブジェクトを初期化することでした。

4

5 に答える 5

4

作成時に、リスナーを実装するオブジェクトへの参照を「SyncData」クラスに渡す必要があります。おそらく、現在、LoginPage には次のようなものがあります。

 new SyncData().execute();

これを次のように変更する必要があります。

 new SyncData(this).execute();

そしてコンストラクターを SyncData に追加します。

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

SyncData のコンストラクターが既にある場合は、代わりに既存のコンストラクターに引数とコードを追加する必要があります。

于 2012-04-12T09:52:07.923 に答える
2

nullダイアログオブジェクトが代わりにそうなる可能性があります

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

試す

if(dialog!=null){
        dialog.dismiss();
于 2012-04-12T09:22:02.597 に答える
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

    }
于 2012-04-12T09:33:33.933 に答える
0

ダイアログが null であるか、コールバックが null です。

行番号を見ると、それがどれであるかがわかります。

于 2012-04-12T09:36:46.123 に答える
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(); 
            }
        });
        }
于 2012-04-12T09:43:41.590 に答える