2014-10-23 2 views
-1

AsyncTask를 구현하고 AsyncTask가있는 인터페이스를 구현하여 생성 된 사용자 개체를 AsyncTask가 .execute() 이후에 시작되는 새 Activity로 전송할 수 있습니다.AsyncTask 인터페이스의 NullPointerException

문제는 인터페이스로 인해 발생한 것으로 보입니다. 데이터 송수신에 문제가 없습니다.

NullPointerException을 유발하는 결과를 선언하지 않습니까? 아무도 잘못 구현 된 것을 볼 수 있습니까?

는 createuser가 여기에

public static class CreateUser extends AsyncTask<User, Void, User> { Context mContext; public interface CreateUserInterface { public void getCreatedUser(User user); public void getUserCreateErrorMessage(String error); } CreateUserInterface callback; public CreateUser(Context context) { // TODO Auto-generated constructor stub this.mContext = context; // callback = (CreateUserInterface) context; } @Override protected User doInBackground(User... params) { ObjectMapper mapper = new ObjectMapper(); // create once, reuse User user = params[0]; String url = ROUTE_USER_CREATE; HttpPost httppost = new HttpPost(url); HttpClient httpclient = new DefaultHttpClient(); String UserJSONResponse = null; try { String jsonString = mapper.writeValueAsString(user); StringEntity m_stringEntity = new StringEntity(jsonString); httppost.setEntity(m_stringEntity); httppost.addHeader("Content-type", "application/json"); HttpResponse postResponse = httpclient.execute(httppost); UserJSONResponse = EntityUtils.toString(postResponse .getEntity()); user = mapper.readValue(UserJSONResponse, User.class); } catch (JsonProcessingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return user; } @Override protected void onPostExecute(User result) { // TODO Auto-generated method stub super.onPostExecute(result); //User user = new User(); Log.e("USERNAME", result.getUser_name()); callback.getCreatedUser(result); } } 

내가에서 사용자를 검색하는 것을 시도하고있는 활동이며, 인터페이스

을 구현
public class UserFragment extends Fragment implements OnClickListener, UserREST.CreateUser.CreateUserInterface { 

UserREST.CreateUser createUserAsyncTask; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup content_frame, 
     Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_user, content_frame, false); 
    createUserAsyncTask = new UserREST.CreateUser(getActivity()); 

    Spinner spinner = (Spinner) view.findViewById(R.id.spinnerUserChoice); 
    // Create an ArrayAdapter using the string array and a default spinner 
    // layout 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      getActivity(), R.array.user_choice_array, 
      android.R.layout.simple_spinner_item); 
    // Specify the layout to use when the list of choices appears 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    // Apply the adapter to the spinner 
    spinner.setAdapter(adapter); 

    setHasOptionsMenu(true); 
    return view; 

} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // TODO Add your menu entries here 
    // inflater = getActivity().getMenuInflater(); 
    inflater.inflate(R.menu.user_navigation, menu); 
    super.onCreateOptionsMenu(menu, inflater); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle presses on the action bar items 
    switch (item.getItemId()) { 
    case R.id.action_createUser: 
     // update the main content by replacing fragments 
     FragmentManager fragmentManager = getFragmentManager(); 
     Fragment mCreateUserFragment = new CreateUserFragment(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.content_frame, mCreateUserFragment).commit(); 

    } 
    return true; 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 

    default: 
     break; 

    } 

} 

@Override 
public void getCreatedUser(User user) { 
    // TODO Auto-generated method stub 
    Log.e("USERNAME", user.getUser_name()); 

} 

@Override 
public void getUserCreateErrorMessage(String error) { 
    // TODO Auto-generated method stub 

} 

스택 추적 :

10-23 14:16:08.265: E/AndroidRuntime(463): FATAL EXCEPTION: main 
10-23 14:16:08.265: E/AndroidRuntime(463): Process: com.e.main, PID: 463 
10-23 14:16:08.265: E/AndroidRuntime(463): java.lang.NullPointerException 
10-23 14:16:08.265: E/AndroidRuntime(463): at com.e.rest.UserREST$CreateUser.onPostExecute(UserREST.java:166) 
10-23 14:16:08.265: E/AndroidRuntime(463): at com.e.rest.UserREST$CreateUser.onPostExecute(UserREST.java:1) 
10-23 14:16:08.265: E/AndroidRuntime(463): at android.os.AsyncTask.finish(AsyncTask.java:632) 
10-23 14:16:08.265: E/AndroidRuntime(463): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
10-23 14:16:08.265: E/AndroidRuntime(463): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
10-23 14:16:08.265: E/AndroidRuntime(463): at android.os.Handler.dispatchMessage(Handler.java:102) 
10-23 14:16:08.265: E/AndroidRuntime(463): at android.os.Looper.loop(Looper.java:136) 
10-23 14:16:08.265: E/AndroidRuntime(463): at android.app.ActivityThread.main(ActivityThread.java:5105) 
10-23 14:16:08.265: E/AndroidRuntime(463): at java.lang.reflect.Method.invokeNative(Native Method) 
10-23 14:16:08.265: E/AndroidRuntime(463): at java.lang.reflect.Method.invoke(Method.java:515) 
10-23 14:16:08.265: E/AndroidRuntime(463): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
+1

디버그 응용 프로그램 및 null의 내용을 확인 .. Prolly 콜백 .. – Selvin

+1

어느 것이 166 행인지에 따라 결과가 널 (null)이거나 콜백이됩니다. –

+0

문제가 해결되었지만 이상하게 보입니다. 인터페이스는 Fragment 대신 Activity에서 구현되어야합니다. 나는 그것이 일이 이루어져야하는 방법인지 확실하지 않습니다. 데이터를 Activity에서 사용하는 것보다 사용해야하는 Fragment에 데이터를 전달하겠습니까? 해당 데이터 (사용자)에 대한 새 개체를 만듭니다. –

답변

0

다음은 문제를 중단하기 위해 변경 한 내용입니다.

내부

 public CreateUser(Context context) { 
     // TODO Auto-generated constructor stub 
     this.mContext = context; 
     callback = (CreateUserInterface) context; 
    } 

createuser가와 NavigationActivity 내가 사용했다

public class NavigationActivity extends ActionBarActivity implements UserREST.CreateUser.CreateUserInterface 

및 관련 방법

@Override 
public void getCreatedUser(User user) { 
    // TODO Auto-generated method stub 
    Log.e("USERNAME", user.getUser_name()); 

} 

@Override 
public void getUserCreateErrorMessage(String error) { 
    // TODO Auto-generated method stub 

}