2017-09-23 8 views
0

안녕하세요, Picasso를 사용하여 내 서버에서 이미지를 가져 와서 Picasta가 Asynctask 및 그 클래스를 확장하는 클래스 내에있는 ImageView 이미지로 설정하는 데 문제가 있습니다. 조각을 확장하는 내 수업에서 불렀다, 나는 내가이 사람에 관한 동일한 문제를 가지고 있다고 생각한다. 그러나 나는 거기에서 대답하는 방법을 사용한다. 나에게 같은 오류를 반복해서 주었다. 여기 :(조각 내부의 Asynctask 내부에서 Picasso를 사용하십시오. java.lang.IllegalStateException

이 AsyncTask를
PostParser.java

public class PostsParser extends AsyncTask<Void,Void,Integer> { 

Context c; 
ProgressBar pb; 
String jsonData; 
LinearLayout linear; 

public PostsParser(Context c, ProgressBar pb, String jsonData, LinearLayout linear){ 
    this.c = c; 
    this.pb = pb; 
    this.jsonData = jsonData; 
    this.linear = linear; 
} 

@Override 
protected Integer doInBackground(Void... params) { 
    return this.parseTag(); 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    pb.setVisibility(View.VISIBLE); 
} 

@Override 
protected void onPostExecute(Integer result) { 
    super.onPostExecute(result); 

    if(result == 0){ 
     Toast noData = Toast.makeText(c, "No data found!", Toast.LENGTH_LONG); 
     noData.setGravity(Gravity.CENTER, 0,0); 
     noData.show(); 
    } else { 
     if(pb.getVisibility()==View.VISIBLE){ 
      pb.setVisibility(View.GONE); 
     } 
    } 
} 

private int parseTag(){ 
    try{ 
     JSONArray ja = new JSONArray(jsonData); 
     JSONObject jo = null; 

     for(int i = 0;i<ja.length();i++){ 
      jo=ja.getJSONObject(i); 

      int id = jo.getInt("id"); 
      final String name = jo.getString("name"); 
      final String postsText = jo.getString("posts_text"); 
      final String imageUrl = jo.getString("image_url"); 

      linear.setOrientation(LinearLayout.VERTICAL); 

      TextView pText = new TextView(c); 
      pText.setText(postsText); 
      pText.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
        LinearLayout.LayoutParams.WRAP_CONTENT)); 
      linear.addView(pText); 

      ImageView pImageView = new ImageView(c); 
      pImageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
      pImageView.setPadding(0,0,0,16); 
      loadImageInBackground(pImageView, imageUrl); 

      linear.addView(pImageView); 

     } 
     return 1; 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return 0; 
} 

public void loadImageInBackground(final ImageView iv, String imageUrl){ 
    Target target = new Target(){ 

     @Override 
     public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
      iv.setImageBitmap(bitmap); 
     } 

     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 
      pb.setVisibility(View.GONE); 
      Toast.makeText(c, "Can't load image", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 
      pb.setVisibility(View.VISIBLE); 
     } 
    }; 
    Picasso.with(c).load(imageUrl).into(target); //line 127 
} } 
를 확장 내 클래스입니다 691,363,210

그리고 이것은 또한 AsyncTask를 연장하지만이 클래스는 아무것도 잘못하지 않았다고 생각 나는이 클래스 그게 내부의 PostParser.java라고

public class TabPosts extends Fragment { 

    LinearLayout linearLayout; 
    ProgressBar pb_posts; 
    View rootView; 
    String companyName; 

    final static String URL = "http://192.168.8.101/servicefinder/DbPostsConnection.php"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.company_posts, container, false); 

     companyName = getArguments().getString("CompanyName"); 

     return rootView; 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     linearLayout = (LinearLayout)rootView.findViewById(R.id.linear); 
     pb_posts = (ProgressBar)rootView.findViewById(R.id.pb_posts); 

     new DownloaderPosts(getActivity(),URL,pb_posts,companyName,linearLayout).execute(); 

    } 
} 

조각
TabPosts.java를 확장 내 자바 클래스 I 때문에 항상 그것을 사용합니다. 내가 여기에 게시해야처럼 그냥
DownloaderPosts.java

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    if(pb.getVisibility() == View.GONE){ 
     pb.setVisibility(View.VISIBLE); 
    } 
} 

@Override 
protected void onPostExecute(String jsonData) { 
    super.onPostExecute(jsonData); 

    pb.setVisibility(View.GONE); 

    if(jsonData == null){ 
     Toast.makeText(c, "Network Error", Toast.LENGTH_LONG).show(); 
    } else { 
     PostsParser postsParser = new PostsParser(c, pb, jsonData, linear); 
     postsParser.execute(); 
    } 
} 

을 :) 기분이 내 오류입니다.

FATAL EXCEPTION: AsyncTask #1 
                     Process: com.gawapa.servicefinder, PID: 12466 
                     java.lang.RuntimeException: An error occured while executing doInBackground() 
                      at android.os.AsyncTask$3.done(AsyncTask.java:300) 
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                      at java.lang.Thread.run(Thread.java:841) 
                     Caused by: java.lang.IllegalStateException: Method call should happen from the main thread. 
                      at com.squareup.picasso.Utils.checkMain(Utils.java:136) 
                      at com.squareup.picasso.RequestCreator.into(RequestCreator.java:496) 
                      at com.gawapa.servicefinder.mMySQL.PostsParser.loadImageInBackground(PostsParser.java:127) 
                      at com.gawapa.servicefinder.mMySQL.PostsParser.parseTag(PostsParser.java:91) 
                      at com.gawapa.servicefinder.mMySQL.PostsParser.doInBackground(PostsParser.java:43) 
                      at com.gawapa.servicefinder.mMySQL.PostsParser.doInBackground(PostsParser.java:27) 
                      at android.os.AsyncTask$2.call(AsyncTask.java:288) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                      at java.lang.Thread.run(Thread.java:841)  
+0

[Picasso + RxJava2 : 주 스레드에서 메서드 호출이 발생할 수 있습니다] (https://stackoverflow.com/questions/41908613/picasso-rxjava2-method-call-should-happen-from-the-main) -thread) –

+0

하지만 선생님 @JoeC 나는 picasso에 대한 호출을 제거 할 때 c.runOnUiThread() –

답변

0

백그라운드 스레드에서 UI 변경을 수행 할 수 없습니다. 이것들은 메인 스레드에서만 할 수 있습니다.

parseTag() 메서드에는 pText.setText(postsText);, iv.setImageBitmap(bitmap); 등과 같은 여러 가지 UI 호출이 포함되어 있습니다.

doInBackGround()에서 실행중인 코드는 간단하고 직선적이며 UI 호출이 포함되어 있습니다. 그래서 나는 왜 당신이 AsyncTask을 사용해야하는지에 대한 어떤 이유도 알지 못합니다. AsyncTasks에 대한 자세한 정보와 왜 필요한지, 어디에서 정보를 읽을 것을 적극 권장합니다.

피카소와 관련하여 모든 내부 피카소 처리는 기본적으로 백그라운드 스레드에서 발생합니다. 그래서 배경 스레드 또는 AsyncTask에서 Picasso 메서드를 사용할 필요가 없습니다.

+0

을 호출 할 수 없다. 모든 것이 잘되었다. pText.setText (postsText); 완전히 잘되고 일하는 것입니다. 제가 물어보고 싶은 것은 피카소라고 부를 때 오류가 있다는 것입니다. –