пытаясь настроить изображение с Пикассо, получая незаконное исключение аргумента цели не должно быть 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 ответ:
Ваша проблема заключается в том, что вы создаете новый экземпляр 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(); } }