2010-07-20 2 views
1

내 서버에서 사용자를 인증하는 것이 매우 간단한 작업이라고 생각합니다. AsyncTask를 내 활동의 개인 서브 클래스로 사용하고 있지만 인증 후 사용자 객체를 채우려고하면 null로 설정됩니다. onPostExecute() 메서드가 호출되어 이것이 원인이되는 이상한 점이 있습니까? 나는 원래 AsyncTask를 자체 클래스로 가졌지 만 동일한 문제를 겪었 기 때문에 private 서브 클래스를 사용하여이 문제를 해결하려고 노력 중이다. 어떤 도움이 필요합니까? 감사. 여기 Null 포인터 오류로 인한 AsyncTask에서 데이터 반환

내 코드입니다 :

public class Testing extends Activity { 

    private User user; 

    public User getUser() { 
     return this.user; 
    } 

    public void setUser(User value) { 
     this.user = value; 
    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     final ImageView iconImage = (ImageView) this.findViewById(R.id.image); 
     final Button testButton = (Button) this.findViewById(R.id.testButton); 
     final TextView text = (TextView) this.findViewById(R.id.text); 
     iconImage.setImageResource(R.drawable.logo_real); 
     testButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       LoginTask loginTask = (LoginTask) new LoginTask().execute(new Void[0]); 
       text.setText(user.getFormattedFullName()); 
      } 
     }); 
    } 

    private class LoginTask extends AsyncTask<Void, Void, User> { 

     public LoginTask() { 
     } 

     protected User doInBackground(Void... params) { 
      User newUser = new User(); 
      try { 
       System.out.println("testing task"); 
       HttpClient client = new DefaultHttpClient(); 
       HttpGet request = new HttpGet("http://10.0.2.2:8080/Dugout/[email protected]&PASSWORD=password"); 
       HttpResponse response = client.execute(request); 
       HttpEntity entity = response.getEntity(); 
       InputStream is = entity.getContent(); 
       String message = ""; 
       String inputLine = ""; 
       BufferedReader bf = new BufferedReader(new InputStreamReader(is)); 
       while ((inputLine = bf.readLine()) != null) message+=inputLine; 
       JSONObject returnedUser = new JSONObject(message); 
       int userId = returnedUser.getInt("userId"); 
       boolean loginSuccess = returnedUser.getBoolean("login_success"); 
       String firstName = returnedUser.getString("firstName"); 
       String lastName = returnedUser.getString("lastName"); 
       newUser.setId(userId); 
       newUser.setFirstName(firstName); 
       newUser.setLastName(lastName); 
       newUser.setLoginSuccess(loginSuccess); 
       return newUser; 
      } catch (Exception e) { 
       newUser.setLoginSuccess(false); 
       return newUser; 
      } 
     } 

     protected void onPostExecute(User user) { 
      setUser(user); 
     } 

    } 

} 

답변

2

당신은이 AsyncTask에 의해 생성되기 전에 user에 액세스하려고

protected void onPostExecute(User user) { 
    text.setText(user.getFormattedFullName()); 
} 

이어야한다 (요점 그러므로 백그라운드 스레드에서 그 doInBackground(..) 실행입니다 UI 스레드를 차단하지 않음).