2017-09-23 82 views
0

你好,大家好,我用畢加索從我的服務器上獲取圖像設置爲我的ImageView的圖像,畢加索是一個擴展的AsyncTask和類的類裏面有一個問題從我的班級被稱爲延伸片段,我想我對這個人有同樣的問題Loading Image using picasso inside AsyncTask,但即使我在回答那裏使用的方法它一次又一次地給我一個相同的錯誤,請幫助我的傢伙,我卡住了這裏 :(使用內部的AsyncTask畢加索片段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 
} } 

這是一個擴展片段
TabPosts.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(); 

    } 
} 

我叫PostParser.java這個類裏面,多數民衆贊成也延伸的AsyncTask,但我認爲這個類沒有做錯什麼我的java類,因爲我總是使用它。我只是覺得我必須張貼在這裏:)
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我不能調用c.runOnUiThread() –

回答

0

您無法從後臺線程執行UI更改。這些只能從主線程完成。

您的parseTag()方法包含多個UI調用,如pText.setText(postsText);,iv.setImageBitmap(bitmap);等。

你在doInBackGround()運行的代碼很簡單,直接的和充滿了UI調用。所以,我看不出有什麼理由需要爲它使用AsyncTask。我強烈建議您詳細閱讀AsyncTasks以及他們需要的地方和原因。

而且,就畢加索而言 - 所有內部畢加索處理後臺線程默認情況下發生的。這就是爲什麼你不需要在後臺線程或AsyncTask中使用畢加索方法。

+0

當我刪除呼籲畢加索,一切正常,該pText.setText(postsText);是完全沒問題的,我想問的是,當我打電話給畢加索時,我得到了一個錯誤, –