簡體   English   中英

在片段java.lang.IllegalStateException中的Asynctask中使用Picasso

[英]Use Picasso inside Asynctask inside Fragment java.lang.IllegalStateException

大家好,我在使用Picasso從服務器獲取圖像以設置為ImageView的圖像時遇到問題,Picasso在擴展Asynctask的類內部,並且從擴展Fragment的類調用了該類,我想我有一個關於這個家伙在AsyncTask中使用picasso加載圖像的同樣問題,但是即使我在那里的答案中使用該方法,它也會一次又一次地給我一個相同的錯誤,請幫助我,我被困在這里:(

這是我的課程,擴展了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
}  }

這是我的Java類,擴展了Fragment
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,但我認為該類沒有做錯任何事情,因為我一直在使用它。 我只是覺得我必須在這里張貼它:)
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) 

您不能從后台線程執行UI更改。 這些只能從主線程完成。

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

您在doInBackGround()運行的代碼非常簡單,直接並且包含UI調用。 因此,我看不出您需要使用AsyncTask任何原因。 我強烈建議您閱讀有關AsyncTasks的更多信息,以及為什么以及在什么地方需要它們。

而且,就Picasso而言-默認情況下,所有內部Picasso處理都在后台線程中進行。 這就是為什么您不需要在后台線程或AsyncTask使用Picasso方法的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM