0

저는 모든 액티비티/프래그먼트에 대한 asyntask를 가졌지 만, 지금은 각 액티비티에 대한 인터페이스를 구현하고 있지만 콜백은 항상 null이며 이유를 알 수 없습니다 . asyncTask라고하는 각각의 액티비티는 인터페이스를 구현합니다. AsyncTask를안드로이드 - 인터페이스 callBack이 널 포인터를 던졌습니다. 예외

public class MainActivity extends Activity implements MainActivityAsyncInterface, OnClickListener, UserPictureDialogInterface { 

private DrawerLayout   moodydrawerLayout; 

private HashMap<String, String> organizedCourses = new HashMap<String, String>(); 

// ManSession Manager Class 
ManSession      session; 

private long     startTime; 
private long     endTime; 
private ModDevice    md; 

private float     screenX; 

private float     screenY; 

private int      shotType   = ShowcaseView.TYPE_ONE_SHOT; 

private MoodleUser    currentUser; 

private String     url; 

private String     token; 

private String     userId; 

private static long    backPressed; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // The following line triggers the initialization of ACRA 
....... 

    session = new ManSession(getApplicationContext()); 
    url = session.getValues(ModConstants.KEY_URL, null); 
    token = session.getValues(ModConstants.KEY_TOKEN, null); 
    userId = session.getValues(ModConstants.KEY_ID, null); 

    new DataAsyncTask(this,).execute(url, token, EXAMPLE.CORE_USER_GET_USERS_BY_ID, userId, MainActivity.class.getSimpleName()); 

    populateLeft(); 
    populateRight(); 
    receiveNotification(); 
    initDemoOverlay(); 
    drawerLayoutListener(); 
    warningMessage(checkConnection(), Toast.LENGTH_LONG, null, getString(R.string.no_internet)); 

    ChangeLogListView sad = new ChangeLogListView(getApplicationContext()); 

} 

AsyncTask를을 인터페이스와 콜의 구현

내 클래스는

public class DataAsyncTask extends AsyncTask<Object, Void, Object> { 
Object        jObj = null; 
public MainActivityAsyncInterface mainActivityInterface; 
private ProgressDialog    dialog; 
private CountDownTimer    cvt  = createCountDownTimer(); 
private Context      context; 
private MoodleServices    webService; 
private String      parentActivity; 
private String      fillTheSpace; 

public DataAsyncTask(Context context) { 
    this.context = context; 
    dialog = new ProgressDialog(context); 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    cvt.start(); 
} 

@Override 
protected Object doInBackground(Object... params) { 
    String urlString = (String) params[0]; 
    String token = (String) params[1]; 
    webService = (MoodleServices) params[2]; 
    Object webServiceParams = params[3]; 
    parentActivity = (String) params[4]; 

     case EXAMPLE: 
      InputStream inputStream = new URL(urlString).openStream(); 
      Drawable drawable = Drawable.createFromStream(inputStream, null); 
      inputStream.close(); 
      return drawable; 

     default: 
      return null; 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

/** 
* <p> 
* Method that parses a supposed id list object 
* </p> 
* 
* @param Object 
*   ids - The object to be parsed to Long[]. 
* @return resultList - The ids List 
*/ 
private Long[] parseIds(Object ids) { 

    Long[] resultList = null; 

    try { 
     resultList = (Long[]) ids; 
    } catch (Exception e) { 
     resultList = new Long[1]; 

     resultList[0] = (Long) ids; 
    } 

    return resultList; 
} 

@Override 
protected void onPostExecute(Object obj) { 
    cvt.cancel(); 

    if (dialog != null && dialog.isShowing()) 
     dialog.dismiss(); 

    switch (webService) { 
    case EXAMPLE: 
     if (parentActivity.equalsIgnoreCase(MainActivity.class.getSimpleName())) 
      mainActivityInterface.userAsyncTaskResult(obj); \\This the line 173 and the obj != null and mainActivityInterface is null 

     if (parentActivity.equalsIgnoreCase(UserDetailsActivity.class.getSimpleName())) 
      fillTheSpace = "TODO - Interface for each parent class"; 

     if (parentActivity.equalsIgnoreCase(FragTopicsPreview.class.getSimpleName())) 
      fillTheSpace = "TODO - Interface for each parent class"; 

     if (parentActivity.equalsIgnoreCase(FragTopics.class.getSimpleName())) 
      fillTheSpace = "TODO - Interface for each parent class"; 
     break; 

    case EXAMPLE2: 
     if (parentActivity.equalsIgnoreCase(MainActivity.class.getSimpleName())) 
      mainActivityInterface.userAsyncTaskResult(obj); 

     if (parentActivity.equalsIgnoreCase(UserDetailsActivity.class.getSimpleName())) 
      fillTheSpace = "TODO - Interface for each parent class"; 

     if (parentActivity.equalsIgnoreCase(FragTopicsPreview.class.getSimpleName())) 
      fillTheSpace = "TODO - Interface for each parent class"; 

     if (parentActivity.equalsIgnoreCase(FragTopics.class.getSimpleName())) 
      fillTheSpace = "TODO - Interface for each parent class"; 
     break; 

    default: 
     break; 
    } 
} 

private CountDownTimer createCountDownTimer() { 
    return new CountDownTimer(250, 10) { 
     @Override 
     public void onTick(long millisUntilFinished) { 

     } 

     @Override 
     public void onFinish() { 
      dialog = new ProgressDialog(context); 
      dialog.setMessage("Loading..."); 
      dialog.setCancelable(false); 
      dialog.setCanceledOnTouchOutside(false); 
      dialog.show(); 
     } 
    }; 
} 

로그 캣 : 내 경험에서

04-27 11:54:11.520: E/AndroidRuntime(1428): FATAL EXCEPTION: main 
04-27 11:54:11.520: E/AndroidRuntime(1428): Process: com.firetrap.moody, PID: 1428 
04-27 11:54:11.520: E/AndroidRuntime(1428): java.lang.NullPointerException 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at connections.DataAsyncTask.onPostExecute(DataAsyncTask.java:173) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at android.os.AsyncTask.finish(AsyncTask.java:632) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at android.os.AsyncTask.access(AsyncTask.java:177) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at android.os.Handler.dispatchMessage(Handler.java:102) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at android.os.Looper.loop(Looper.java:136) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at java.lang.reflect.Method.invoke(Method.java:515) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
04-27 11:54:11.520: E/AndroidRuntime(1428):  at dalvik.system.NativeStart.main(Native Method) 

인터페이스하지 않습니다 내 코드와 함께 nullPointer 예외를 보내야하고 인터페이스를 초기화 할 필요는 없지만이 시점에서 나는 모든 옵션을 테이블에 둔다.

+0

에 대한 참조를 통과 할 수있는 라인 onPostExecute (DataAsyncTask.java:173)? – Szymon

+1

줄에 플래그를 지정하는 코드에 대한 주석이 있습니다. mainActivityInterface.userAsyncTaskResult (obj); \\이 줄은 173이고 obj! = null이고 mainActivityInterface는 null입니다 – firetrap

+0

mainActivityInterface를 초기화하지 않았습니까? –

답변

2

리스너를 작업에 전달하지 않기 때문에 발생합니다.

에서만 constrctuor에 컨텍스트를 보낼 수 있지만 다음과 같아야합니다 활동에

public DataAsyncTask(Context context , MainActivityAsyncInterface mainActivityInterface) { 
    this.context = context; 
    this.mainActivityInterface = mainActivityInterface; 
    dialog = new ProgressDialog(context); 
} 

당신이 당신의 작업을 시작하는 곳이를 추가 할 수 있습니다.

YourAcivity.this. 

업데이트 : 귀하의 질문에 대답,

당신은 의지가 활동을 확장하는 BaseActivity를 작성하고 리스너를 구현할 수 있습니다. 그러면 모든 활동이 수신기 기능을 무시해야합니다.

+0

이 가능성을 보았습니다.하지만 문제는 각 액티비티에 대해 각 인터페이스마다 6 개 이상의 인터페이스가 있기 때문에 유일한 해결책은 6 개의 생성자를 갖는 것입니다. 인터페이스에 일반 유형이 있습니까? – firetrap

+0

먼저 어딘가에서 초기화 할 때까지 리스너를 사용할 수 없다는 것을 먼저 이해해야합니다. – SacreDeveloper

+0

@firetrap 귀하의 인터페이스에서'userAsyncTaskResult' 메소드 만 사용하는 것 같습니다. 메소드를 정의하는 인터페이스 여야합니다. – Szymon

1

MainActivityAsyncInterface이 활동에서 구현하는 인터페이스 인 경우 비동기 작업에 전달해야합니다. 현재 mainActivityInterface은 초기화되지 않으며 항상 null이므로 예외가 발생합니다.

당신은 당신의 생성자

public DataAsyncTask(Context context, MainActivityAsyncInterface mainActivityInterface) { 
    this.context = context; 
    this.mainActivityInterface = mainActivityInterface; 
    dialog = new ProgressDialog(context); 
}