试图用毕加索设置图像,获取非法参数异常目标不能为空

trying to set images with Picasso, getting illegal argument exception target must not be null

我想用 Jsoup 下载一些 urls,然后将它们设置为源 urls 以使用 Picasso 查看图像。但是我遇到了很多困难。

然后我决定只从 jSoup class 发送一个硬编码 url 给毕加索,这导致了一个异常

这是我的 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 Activity

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 部分,它工作正常 Activity。

现在,请问有没有人知道哪里出了问题。

您的问题是您正在 Asynctask 中创建 MainActivity 的新实例:MainActivity mainActivity = new MainActivity();

如果您考虑异步任务的 activity 生命周期,则此方法会存在许多问题。但是对于您的问题 - 对于这种特殊情况,您的异步任务只需要引用 Activity 启动它。您需要将其传递到异步任务中,很可能是在构造函数中。如果你走那条路,请将你的 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();
          }
     }