你好,大家好,我用畢加索從我的服務器上獲取圖像設置爲我的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)
[Picasso + RxJava2:方法調用應該發生在主線程中]的可能重複(https://stackoverflow.com/questions/41908613/picasso-rxjava2-method-call-should-happen-from-the-main -thread) –
但先生@JoeC我不能調用c.runOnUiThread() –