2015-09-05 3 views
-1

Я создал приложение, в котором пользователь регистрируется со своими учетными данными, а также загружает изображение профиля. При входе в систему пользователь вводит свое имя пользователя, пароль и имя изображения, которое он загрузил. До сих пор пользователь успешно регистрируется с его учетными данными вместе со своим профилем pic. Я сохранил учетные данные пользователя в MySql, пока изображение пользователя хранится в папке на том же сервере. Теперь, когда я пытаюсь войти в систему, он дает мне NullPointerException, и мое приложение падает. Я не знаю, почему это происходит, я проверил свой код, я не нашел ошибки. Я загружаю его здесь. Пожалуйста, предоставьте мне ответ. Спасибо.DownloadImage при входе в систему

Login.java

public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.bLogin: 
      String username = etUsername.getText().toString(); 
      String password = etPassword.getText().toString(); 
      String name1=etimagen.getText().toString(); 
      User user = new User(username, password,name1); 
      DownloadImage di=new DownloadImage(etimagen.getText().toString()); 
      di.execute(); 

      authenticate(user); 
      break; 
     case R.id.tvRegisterLink: 
      Intent registerIntent = new Intent(Login.this, Register.class); 
      startActivity(registerIntent); 
      break; 
    } 
} 

private void authenticate(User user) { 
    ServerRequests serverRequest = new ServerRequests(this); 
    serverRequest.fetchUserDataAsyncTask(user, new GetUserCallback() { 
     @Override 
     public void done(User returnedUser) { 
      if (returnedUser == null) { 
       showErrorMessage(); 
      } else { 
       logUserIn(returnedUser); 
      } 
     } 
    }); 
} 

private void showErrorMessage() { 
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(Login.this); 
    dialogBuilder.setMessage("Incorrect user details"); 
    dialogBuilder.setPositiveButton("Ok", null); 
    dialogBuilder.show(); 
} 

private void logUserIn(User returnedUser) { 
    userLocalStore.storeUserData(returnedUser); 
    userLocalStore.setUserLoggedIn(true); 
    startActivity(new Intent(this, MainActivity.class)); 
} 
public class DownloadImage extends AsyncTask<Void, Void, Bitmap> 
{ 

    String name1; 

    public DownloadImage(String name1) 
    { 
     this.name1=name1; 

    } 

    @Override 
    protected Bitmap doInBackground(Void... arg0) { 


     String url=SERVER_ADDRESS + "pictures1/" + name1 + ".JPG"; 
     try 
     { 
      URLConnection connection=new URL(url).openConnection(); 
      connection.setConnectTimeout(1000*30); 
      connection.setReadTimeout(1000*30); 

      return BitmapFactory.decodeStream((InputStream) connection.getContent(),null,null); 


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

     return null; 
    } 

@Override 
    public void onPostExecute(Bitmap bitmap) { 

     super.onPostExecute(bitmap); 
     if(bitmap!=null) 
     { 

      MainActivity main=new MainActivity(); 
      main.bitmap=bitmap; 
      main.image(); 
     } 




} 




} 

MainActivity.java

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
     case R.id.bLogout: 
      userLocalStore.clearUserData(); 
      userLocalStore.setUserLoggedIn(false); 
      Intent loginIntent = new Intent(this, Login.class); 
      startActivity(loginIntent); 
      break; 
    } 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    if (authenticate() == true) { 
     displayUserDetails(); 


    } 
} 





private boolean authenticate() { 
    if (userLocalStore.getLoggedInUser() == null) { 
     Intent intent = new Intent(this, Login.class); 
     startActivity(intent); 
     return false; 
    } 
    return true; 
} 


private void displayUserDetails() { 
    User user = userLocalStore.getLoggedInUser(); 

    etUsername.setText(user.username); 
    etName.setText(user.name); 
    etAge.setText(user.age + ""); 


} 

public Bitmap image() { 
    image2.setImageBitmap(bitmap); 
    return bitmap; 

} 

}

Error Log

09-05 15:39:34.179: E/AndroidRuntime(4236): FATAL EXCEPTION: main 
09-05 15:39:34.179: E/AndroidRuntime(4236): Process: com.example.loginregister, PID: 4236 
09-05 15:39:34.179: E/AndroidRuntime(4236): java.lang.NullPointerException 
09-05 15:39:34.179: E/AndroidRuntime(4236):  at com.example.loginregister.MainActivity.image(MainActivity.java:86) 
09-05 15:39:34.179: E/AndroidRuntime(4236):  at com.example.loginregister.Login$DownloadImage.onPostExecute(Login.java:132) 
09-05 15:39:34.179: E/AndroidRuntime(4236):  at com.example.loginregister.Login$DownloadImage.onPostExecute(Login.java:1) 
09-05 15:39:34.179: E/AndroidRuntime(4236):  at android.os.AsyncTask.finish(AsyncTask.java:632) 
09-05 15:39:34.179: E/AndroidRuntime(4236):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
09-05 15:39:34.179: E/AndroidRuntime(4236):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
+0

@rj ив путы .. вы можете посмотреть –

+0

ошибки находится на линии в MainActivity нет 86, но вы не поставили весь код MainActivity, его трудно понять –

+0

Я положил основную часть –

ответ

0

Замените код остроумие ч,

public Bitmap image() { 
    if(bitmap!=null) 
     image2.setImageBitmap(bitmap); 
    return bitmap; 
} 

Ваш растровый объект в нуль, поэтому он дает вам NullPointerExcepition на линии,

  image2.setImageBitmap(bitmap); 

Позвольте мне знать, если он работает для вас ... И пометить его как ответ так что это было бы полезно для других ...

+0

все еще ssame :( –

+0

показать мне журнал, на этот раз должна быть какая-то другая ошибка –

+0

Свое же чувак ... –

0

Во-первых, я предполагаю, что вы новичок в Android Development.

Вы пытаетесь загрузить изображение пользователя и отобразить его на MainActivity. Существует две проблемы с архитектурой.

  • Первый

    В приведенной ниже фрагмент кода инициирует два запроса асинхронной. Нет гарантии, что запрос изображения будет завершен после входа в систему или наоборот. Я предлагаю вам поместить запрос изображения внутри MainActivity после того, как пользователь выполнил вход в систему. Значение, поместите его после authenticate(user) успеха.

    User user = new User(username, password,name1); 
        DownloadImage di=new DownloadImage(etimagen.getText().toString()); 
        di.execute(); 
        authenticate(user); 
    
  • Второй

Ниже фрагмент кода создает новый экземпляр MainActivity и пытается присваивает извлеченный растровое ImageView. Нужно знать, что onCreate выполняется только перед отображением активности. Он не будет вызван, когда будет сделано new MainActivity(). Таким образом, нет никакой возможности установить image2 со значением. Вот почему вы получаете ошибку.

public void onPostExecute(Bitmap bitmap) { 
    super.onPostExecute(bitmap); 
    if(bitmap!=null) 
     { 
      MainActivity main=new MainActivity(); 
      main.bitmap=bitmap; 
      main.image(); 
     } 
    } 

Я предполагаю, так как вы хотите, чтобы установить изображение где-то на MainActivity, вы должны сделать запрос на изображение внутри MainActivity, вероятно, в onCreate.

Также этот startActivity(new Intent(this, MainActivity.class)); в методе login начнет новое мероприятие. Это полностью отличается от MainActivity экземпляра от того, который вы создаете в onPostExecute. Передайте URL-адрес изображения через bundle extra, чтобы получить его в onCreate, сделать обратный вызов и отобразить его на изображении.

Надеется, что это помогает :): :)

+0

Привет, @ Пантера, я очень ценю ваше усилие, да, я начинаю в разработке Android. Точки, о которых вы упомянули выше, весьма полезны. Я начинаю, поэтому я смущаюсь о том, где внести изменения в файл. Можете ли вы, пожалуйста, сделать мне одолжение, внеся изменения в вышеуказанные файлы, как вы упомянули. Это было бы очень полезно. Спасибо. –

+0

А также, пожалуйста, скажите, как мне передать URL-адрес изображения? –

Смежные вопросы