2016-08-04 1 views
1

im пытается создать объект пользователя, когда пользователь входит в систему и сохраняет его в общих привилегиях. пользовательский объект имеет имя и фамилию, которые im retreiving из json-объекта и профиль растрового изображения pic, который im пытается получить с piccaso (линия к изображению также находится в объекте json). Я попробовал его с волейболом и с асинкстасом в обоих случаях, я получаю expeption.java.lang.IllegalStateException: вызов метода не должен происходить из основного потока с помощью piccaso

моя модель пользователя:

public class User{ 

    private String name,lastName; 
    private Bitmap profilePicture; 
    Context context; 

    public User(JSONObject object , Context context){ 
     this.context = context; 

     try { 
      this.name = object.getString("firstName"); 
      this.lastName = object.getString("lastName"); 
      this.profilePicture = Picasso.with(context).load(object.getString("image")).get(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

и мой запрос залп:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try { 

          Intent intent = new Intent(LoginActivityScreen.this, HomeActivityScreen.class); 

          SharedPreferences.Editor editor = preferences.edit(); 

          RoomateModel model = new RoomateModel(response, context); 


          Gson gson = new Gson(); 
          String json = gson.toJson(model); 
          editor.putString("USER", json); 
          editor.commit(); 


          startActivity(intent); 


         } 

        } 

ответ

2

В основном это инкапсуляция NetworkOnMainThreadException.

Вы должны проверить, где вы звоните User(...) конструкторы, так как у них есть эта строка:

this.profilePicture = Picasso.with(context).load(object.getString("image")).get(); 

который эффективно делает удаленный вызов для получения изображения с object.getString("image") URL. Убедитесь, что вызов выполняется в потоке, отличном от UI. Это главное преимущество использования Picasso, потому что он гарантирует, что обработка сети и буферизация данных выполняются внутри одного потока, а раздувание ресурса (изображения) внутри элемента пользовательского интерфейса Android (ImageView) выполняется в потоке пользовательского интерфейса без каких-либо дополнительных усилий со стороны пользователя библиотеки.

В качестве альтернативы, вы можете попробовать использовать Target интерфейс Пикассо:

Picasso.with(context).load(object.getString("image").into(new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     //This gets called when your application has the requested resource in the bitmap object 
     User.this.profilePicture = bitmap; 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     //This gets called if the library failed to load the resource 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) { 
     //This gets called when the request is started 
    } 
}); 
+1

я попытался назвать его из doInBackground() в AsyncTask я имел то же исключение. @NitroNbg –

+1

Проверьте изменение, чтобы увидеть альтернативу. Однако я не рекомендую выдавать асинхронный вызов даже с обратным вызовом внутри конструктора объекта. Вы можете сохранить только «String» (URL) изображения профиля в вашем объекте «Пользователь», а затем выпустить «Piccasso.with (context) .load (user.getProfilePicture()). В (imageView)», когда вы чтобы отобразить это изображение пользователя в приложении. – NitroNbg

+1

спасибо большое! он работал @ NitroNbg –

-1

Попробуйте добавить эту часть до того кода, чтобы загрузить изображение

if (android.os.Build.VERSION.SDK_INT > 9) { 
      StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
} 
+0

Это не сработало. –

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

  • Нет связанных вопросов^_^