пытаясь настроить изображение с Пикассо, получая незаконное исключение аргумента цели не должно быть null


Я пытаюсь загрузить несколько URL-адресов с Jsoup, а затем установить их в качестве исходных URL-адресов для просмотра изображений с Picasso. но мне было очень трудно сделать это.

Тогда я решил просто отправить один единственный жестко закодированный url Пикассо из класса jSoup, что привело к исключению

Вот код для моей основной активности

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();
}



}

Я думаю, что это как-то связано с тем, что я устанавливаю изображение в сетимаге метод.

Я говорю это, потому что это прекрасно работает, если я делаю часть Пикассо после оператора jsoup execute в блоке try в Main Activity.

Теперь, пожалуйста, у кого-нибудь есть ответ на то, что неправильно.
1 2

1 ответ:

Ваша проблема заключается в том, что вы создаете новый экземпляр MainActivity в вашей Asynctask: MainActivity mainActivity = new MainActivity();

Существует ряд проблем с этим подходом, если вы рассматриваете жизненный цикл действия с вашей асинхронной задачей.. но к вашему вопросу-для этого конкретного случая вашей асинхронной задаче просто нужна ссылка на действие, которое ее запускает. Вам нужно передать это в асинхронную задачу, скорее всего, в конструктор. Если вы идете по этому маршруту, пожалуйста, оберните свою деятельность в слабую область, чтобы вы этого не делали. вызвать давление памяти.

Вот что исправит это: (обратите внимание, что я не компилировал это, поэтому могут быть опечатки)

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();
          }
     }