我试图用Jsoup下载一些url,然后将它们设置为毕加索图像视图的源url。但是我做起来很困难。
然后我决定只从jSoup类发送一个硬编码的url给picasso,这导致了一个异常
下面是我的MainActivity 的代码package com.vsoft.tsubdl;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
public ImageView imageView;
public static ImageView imageView2;
ImageView imageView3;
ImageView imageView4;
String[] tinyurl = {"http://2tinysub.net/"};
JsonParser jsonParser;
ArrayList<ImageView> imageViewsArray;
public static Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView2 = (ImageView) findViewById(R.id.imageView2);
imageView3 = (ImageView) findViewById(R.id.imageView3);
imageView4 = (ImageView) findViewById(R.id.imageView4);
mContext = this;
imageViewsArray = new ArrayList<>();
imageViewsArray.add(imageView);
imageViewsArray.add(imageView2);
imageViewsArray.add(imageView3);
imageViewsArray.add(imageView4);
jsonParser = new JsonParser();
try {
jsonParser.execute(tinyurl);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setImages(){
Picasso.with(MainActivity.mContext)
.load(jsonParser.theUrl)
.into(imageView);
}
这是我的JsoupParser活动
public class JsonParser extends AsyncTask<String,Void,String> {
public String[] URLS = {"","","",""};
public static String theUrl = "";
MainActivity mainActivity = new MainActivity();
@Override
protected String doInBackground(String... urls) {
try {
Document doc = Jsoup.connect("http://2tinysub.net/").get();
Elements links = doc.select(".box .details ul li");
Elements picURLS = doc.select(".details .poster img");
Element firsimage = picURLS.first();
theUrl = "https://i.jeded.com/i/now-you-see-me-2.135-52356.jpg";
} catch (Exception e) {
e.printStackTrace();
}
return theUrl;
}
@Override
protected void onPostExecute(String s) {
mainActivity.setImages();
}
}
我认为这与我在setImage方法中设置图像的事实有关。
我这样说是因为如果我在Main Activity的try块中的Jsoup执行语句之后执行picasso部分,它会很好。
你的问题是,你正在创建一个新的MainActivity实例在你的Asynctask: MainActivity mainActivity = new MainActivity();
如果你考虑异步任务的活动生命周期,这种方法有很多问题。但是对于你的问题-对于这种特殊情况下,你的异步任务只需要一个对启动它的Activity的引用。您需要将其传递给异步任务,很可能是在构造函数中。如果你走那条路,请把你的活动包装在一个WeakReference中,这样你就不会造成内存压力。
下面是修复它的方法:(注意,我没有编译这个,所以可能有拼写错误)
public class JsonParser extends AsyncTask<String,Void,String> {
private WeakReference<MainActivity> mainActivityReference;
public JsonParser(MainActivity activity) {
mainActivityReference = new WeakReference(activity);
}
... <your other code>
@Override
protected void onPostExecute(String s) {
//Because the activity could be destroyed, don't store a hard reference to the activity
//Also you should probably check to make sure the activity is in a good state
MainActivity activity = mainActivityReference.get();
if(activity != null) {
activity.setImages();
}
}