试图用毕加索设置图像,得到的非法参数异常目标必须不为空



我试图用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();
          }
     }

最新更新