2015-05-28 21 views
5

Vấn đề là như sau. Tôi có hoạt động đăng nhập (trong Android Studio) hoạt động tốt vài ngày trước đó. Tôi không nhớ thay đổi bất cứ điều gì, nhưng khi tôi chạy này một lần trước khi ứng dụng đóng ngay sau khi tôi nhấp vào nút đăng nhập. Điều cuối cùng được chỉ ra là bánh mì nướng về việc thực hiện trước AsyncTask. Và tôi không thể hiểu tại sao có thể có một NullPointerException. Tôi có cùng mã cho hoạt động đăng ký của mình và hoạt động tốt.

Đây là nhật ký:

05-28 16:04:52.395 1218-1232/system_process V/WindowManager﹕ addAppToken: AppWindowToken{5d89eb token=Token{23ccc93a ActivityRecord{2fe54865 u0 utanashati.reminder/.HomepageActivity t17}}} to stack=1 task=17 at 1 
05-28 16:04:52.407 19927-19927/utanashati.reminder D/AndroidRuntime﹕ Shutting down VM 
05-28 16:04:52.408 19927-19927/utanashati.reminder E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: utanashati.reminder, PID: 19927 
    java.lang.RuntimeException: Unable to start activity 
ComponentInfo{utanashati.reminder/utanashati.reminder.HomepageActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
      at utanashati.reminder.HomepageActivity.onCreate(HomepageActivity.java:55) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5257) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
05-28 16:04:52.410 1218-1232/system_process W/ActivityManager﹕ Force finishing activity 1 utanashati.reminder/.HomepageActivity 
05-28 16:04:52.411 1218-1232/system_process W/ActivityManager﹕ Force finishing activity 2 utanashati.reminder/.LoginActivity 

EDIT 1

tôi đã mắt tôi mở ra, vấn đề không phải là với LoginActivity, nhưng với HomepageActivity. Đây là mã:

import ... 

public class HomepageActivity extends Activity implements AdapterView.OnItemSelectedListener { 

    protected EditText mAddTaskText; 
    protected Spinner mPrioritySpinner; 
    protected Button mAddTaskButton; 
    protected int intPriority = 0; 
    protected String taskText; 
    protected Timestamp taskTimestamp; 
    protected Task userTask; 
    protected JsonGenerator taskJSON; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) {      // Starts activity. The state can be restored from savedInstanceState 
     super.onCreate(savedInstanceState);          // Calls the superclass method (IMPORTANT) 
     setContentView(R.layout.activity_homepage);        // Sets layout from activity_homepage.xml 

     mPrioritySpinner = (Spinner) findViewById(R.id.prioritySpinner);  // Creates an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.priorityList, android.R.layout.simple_spinner_item); // Specifies the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  // Applies the adapter to the spinner 
     mPrioritySpinner.setAdapter(adapter); 
     mPrioritySpinner.setOnItemSelectedListener(this); 

     mAddTaskText = (EditText) findViewById(R.id.addTaskEditText);   // Finds View by its id in .xml file 
     mAddTaskButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(HomepageActivity.this, "Done!", Toast.LENGTH_LONG).show(); 

       Calendar taskCalendar = Calendar.getInstance();    // Creates new calendar 
       long taskTime = taskCalendar.getTimeInMillis();    // Gets time in milliseconds 
       taskTimestamp = new Timestamp(taskTime);     // Creates new Timestamp 
       taskText = mAddTaskText.getText().toString();    // Gets description of the task 

       userTask.setDate(taskTimestamp);       // Sets date 
       userTask.setText(taskText);         // Sets text 

       /* Creating JsonGenerator */ 
       ObjectMapper mapper = new ObjectMapper(); 
       try { 
        mapper.writeValue(taskJSON, userTask); 
       } 
       catch (IOException e) { 
        Toast.makeText(HomepageActivity.this, "Could not create JSON", Toast.LENGTH_LONG).show(); 
       } 

       /* Getting out email and password */ 
       String userPassword = ((EmailPassword) HomepageActivity.this.getApplication()).getPassword(); 
       String userEmail = ((EmailPassword) HomepageActivity.this.getApplication()).getUserEmail(); 
       Toast.makeText(HomepageActivity.this, userEmail + " " + userPassword, Toast.LENGTH_LONG).show(); 

       /* HTTP stuff */ 
       HttpPoster get = new HttpPoster(); 
       get.execute(userEmail, userPassword, taskJSON.toString()); 
      } 
     }); 
    } 

    public int getData (String username, String password, String taskJSON) { 
     try { 
      HttpPost httpPost = new HttpPost("http://something.com/" + username + "/tasks"); 
      String dataToEncode = username + ":" + password; 
      String encodedData = Base64.encodeToString(dataToEncode.getBytes(), Base64.NO_WRAP); 
      httpPost.setHeader("Authorization", encodedData); 

      try { 
       StringEntity taskEntity = new StringEntity(taskJSON, "UTF-8"); 
       httpPost.setEntity(taskEntity); 
      } 
      catch (UnsupportedEncodingException e) { 
       Toast.makeText(HomepageActivity.this, "Unsupported encoding", Toast.LENGTH_LONG).show(); 
      } 

      HttpClient client = new DefaultHttpClient(); 
      HttpResponse response = client.execute(httpPost); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       return 1; 
      } 
      else if (statusCode == 404) { return 2; } 
      else if (statusCode == 500) { return 3; } 
      else if (statusCode == 409) { return 4; } 
      else { return statusCode; } 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return 0; 
    } 

    public void onItemSelected(AdapterView<?> parent, View view, 
           int pos, long id) { 
     String priority = parent.getItemAtPosition(pos).toString();    // Gets chosen priority 
     Toast.makeText(HomepageActivity.this, priority, Toast.LENGTH_LONG).show(); 
     while (!((priority.equals("Low")) || (priority.equals("Medium")) || (priority.equals("High")))) { 
      Toast.makeText(HomepageActivity.this, "Something bad happened. Try to choose again", Toast.LENGTH_LONG).show(); 
     } 
     if (priority.equals("Low")) { 
      intPriority = 0; 
     } 
     else if (priority.equals("Medium")) { 
      intPriority = 1; 
     } 
     else if (priority.equals("High")) { 
      intPriority = 2; 
     } 
     userTask.setPriority(intPriority);          // Sets chosen priority 
    } 

    public void onNothingSelected(AdapterView<?> parent) { 
     userTask.setPriority(intPriority);          // Sets default priority ("0") 
    } 

    public class HttpPoster extends AsyncTask<String, Void, Integer> { 

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

     @Override 
     protected Integer doInBackground(String... params) { 
      return getData(params[0], params[1], params[3]); 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      super.onPostExecute(result); 
      if (result == 1) { 
       Toast.makeText(HomepageActivity.this, "Login successful", Toast.LENGTH_LONG).show(); 
       Intent takeUserHome = new Intent(HomepageActivity.this, HomepageActivity.class); 
       startActivity(takeUserHome); 
      } 
      else if (result == 2) { 
       Toast.makeText(HomepageActivity.this, "No such user", Toast.LENGTH_LONG).show(); 
      } 
      else if (result == 3) { 
       Toast.makeText(HomepageActivity.this, "Internal server error: unable to send email", Toast.LENGTH_LONG).show(); 
      } 
      else if (result == 4) { 
       Toast.makeText(HomepageActivity.this, "Task already exists", Toast.LENGTH_LONG).show(); 
      } 
      else { 
       Toast.makeText(HomepageActivity.this, result.toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

Và XML file:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="utanashati.testapp.HomepageActivity"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="Add a new task..." 
     android:id="@+id/addTaskEditText" 
     android:nestedScrollingEnabled="false" 
     android:minLines="1" 
     android:maxLines="1" /> 

    <Spinner 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/prioritySpinner" 
     android:layout_alignRight="@+id/addTaskButton" 
     android:layout_alignEnd="@+id/addTaskButton" 
     android:layout_below="@+id/addTaskEditText" /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Add task" 
     android:id="@+id/addTaskButton" 
     android:layout_below="@+id/prioritySpinner" 
     android:layout_centerHorizontal="true" /> 

</RelativeLayout> 
+0

Các stacktrace bạn đăng trỏ đến một vấn đề trong 'HomepageActivity' mã không 'LoginActivity' mà bạn đã đăng. –

+0

Lỗi của bạn trong HomepageHoạt động hoạt động, bạn có thể đặt mã đó ở đây không. –

+0

@ci_ Wow, bạn đã mở mắt, cảm ơn bạn :) – Olesya

Trả lời

6

mAddTaskButton là null bởi vì bạn không bao giờ khởi tạo nó với:

mAddTaskButton = (Button) findViewById(R.id.addTaskButton); 

trước khi bạn gọi mAddTaskButton.setOnClickListener().

+3

Tôi có cùng một vấn đề nhưng tôi đã khởi tạo nó một cách chính xác. –

5

Có vẻ như nút bạn đang gọi không nằm trong bố cục bạn đang sử dụng trong setContentView(R.layout.your_layout) Hãy thử xem.

-1

Đó đúng, Mustafa .... working..its nó trỏ đến hai bố trí

  1. setContentView (R.layout.your_layout)
  2. v23 (your_layout).

Bạn nên Nút cả bố trí hoạt động ...
giải quyết vấn đề này thành công

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17605173) – Shaido

Các vấn đề liên quan

 Các vấn đề liên quan