2016-08-23 8 views
2

私はJsoupでいくつかのURLをダウンロードし、ピカソの画像ビューのソースURLとして設定します。しかし、私はそうすることが非常に困難でした。ピカソで画像を設定しようとすると、不正な引数例外のターゲットがnullにならないようにしてください。

が、私はちょうど例外ここ

になったjSoupクラスからピカソする1つのハードコードされた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活動

されています
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メソッドでイメージを設定しているという事実と関係があると思います。

私は、メインアクティビティのtryブロックのJsoup executeステートメントの後にピカソの部分を実行するとうまく動作するため、これを言っています。

今、何が間違っているかの回答がありますか?

+0

例外に関するいくつかの情報を追加してください。 –

答えて

0

あなたは問題だが、あなたのAsynctaskにMainActivityの新しいインスタンスを作成しているということです。MainActivity mainActivity = new MainActivity();

あなたは非同期タスクとアクティビティのライフサイクルを考慮すれば、このアプローチには多くの問題があります..しかし、あなたの質問に - この特定のケースでは、あなたの非同期タスクはそれを開始するアクティビティへの参照を必要とします。これを非同期タスクに渡す必要があります。非同期タスクは、コンストラクタ内で実行される可能性が最も高いです。もしあなたがそのルートに行くなら、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(); 
      } 
    } 
+0

私はプログラミングに本当に新しいです、もっと説明できますか? –

+0

JsonParser Asynctaskは、既存のMainActivityを使用するのではなく、独自のMainActivityを作成します。そのため、そのアクティビティはアクティブではないため、imageviewはnullです。 – BoredAndroidDeveloper

+0

私は答えを編集して事を明確にし、例を挙げました – BoredAndroidDeveloper

関連する問題