2017-03-18 4 views
-2

RecyclerViewのデータをウェブサイトから廃棄することを試みています。問題はgetData()メソッドのSearchCards.java(モデル)の前に文字列(pageTitle)を返します。AsyncTaskが実行され、空のStringが返されます。ここに私のコードはScrapping.javaがAsyncTaskのonPostExecute()が実行された後に値を返す方法は?

mAdapter = new SearchAdapter(SearchCards.getData(),this,recyclerView); 
recyclerView.setAdapter(mAdapter); 

SearchCards.java

public static ArrayList<SearchCards> getData() { 

    ArrayList<SearchCards> datatList = new ArrayList<SearchCards>(); 

    String pageTitle = new Scrapping().scrapSubs(); //scrapSubs contains AsynTask      
    String[] yearArr = setYearArr(); 

    for (int i = 0; i < yearArr.length; i++) { 
     SearchCards searchCard = new SearchCards(); 
     searchCard.setYear(yearArr[i]); 
     searchCard.setTitle(pageTitle); //same pagetitle for every year 
     datatList.add(searchCard);    
    }  

    return dataList; 
} 

FragmentOne.java

ある

public String ScrapSubs(){ 
    JsoupAsyncTask jsoupAsyncTask = new JsoupAsyncTask(); 
    jsoupAsyncTask.execute(); 
    return pageTitle; 
} 

private class JsoupAsyncTask extends AsyncTask<Void, Void, Void> { 
    @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       htmlDocument = Jsoup.connect(htmlPageUrl).get(); 
       pageTitle = htmlDocument.title(); 
       Log.i(TAG,"PAGETITLE"+pageTitle); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

    @Override 
     protected void onPostExecute(Void result) { 
     //do something 
     } 
} 

Scrapping.javaのreturn pageTitleのような操作は、AsyncTaskの実行が完了した後にのみ実行されます。私はこれを試みたが、うまくいきませんでした:

if(jsoupAsyncTask.getStatus() == AsyncTask.Status.FINISHED){ 
    return pageTitle; 
} 

EDIT: が、これはよく研究問題ではなかったかもしれませ。ここで私が探していたものが見つかりました:http://stacktips.com/tutorials/android/android-recyclerview-example 私がしなければならなかったのは、onPostExecute()でSearchAdapterの初期化を移動することでした。

+0

'保護された無効onPostExecute(ボイド結果){// がsomething'を行います。だけでなく、何か。しかし、たとえば、変更されたgetData()を呼び出してリストビューを設定します。それは普通の方法です。あなたのデザインに適応してください。あなたが今持っているものは、まったく行く方法ではありません。 – greenapps

+0

可能性のある複製http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a –

+0

入力いただきありがとうございます。アンドロイドに新しいし、適応しようとしています。ここでの答えは、私が進めるためにいくらか明確にしましたが。 – mustafa1993

答えて

1
private class JsoupAsyncTask extends AsyncTask<Void, Void, You Result Data Type> { 
     @Override 
     protected You Result Data Type doInBackground(Void... params) { 
      try { 
       htmlDocument = Jsoup.connect(htmlPageUrl).get(); 
       pageTitle = htmlDocument.title(); 
       Log.i(TAG,"PAGETITLE"+pageTitle); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return Your Execution Result; 
     } 

     @Override 
     protected void onPostExecute(You Result Data Type Your Execution Result)   { 
     //Do Rest of Your Program 
     } 
} 
0

あなたのコードがsyncrhonously実行したい場合、あなたはまったくAsyncTaskを使用する必要がいけない - ちょうどあなたが必要なものないメソッドを作成して、それを呼び出します。 これはUIスレッドでは機能しません.UIスレッドメソッドはすばやく返さなければなりません。 おそらくデザインを考え直す必要があります。あなたのAsyncTaskがバックグラウンドで実行されている間、そしてデータの移動と表示が行われている間だけ、「待機中のUI」、スピナー、プログレスバーなどを表示する1つの方法です。

+0

私はAsyncTaskなしでやってみました。それは例外を投げる。 https://developer.android.com/reference/android/os/NetworkOnMainThreadException.html – mustafa1993

+0

もちろんです。あなたはそれがなぜ、そしてあなたの考えがうまくいかないのかを学ばなければなりません。 – Okas

+0

はい、私は今働いています。私のアプローチは以前は間違っていた。今私は、私のフラグメントクラスから直接AsyncTask.execute()を呼び出し、onPostExecute()でRecyclerViewを初期化しています。あなたが示唆したように、私は自分のデザインを再考しました。 – mustafa1993

0

intarfaceを作成します。

private class JsoupAsyncTask extends AsyncTask<Void, Void, Void> { 

    public interface FinishListener { 
     void processFinish(Boolean isFinish); 
    } 

    FinishListener finishListener = null; 

    public JsoupAsyncTask(FinishListener finishListener) { 
     this.finishListener = finishListener; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      htmlDocument = Jsoup.connect(htmlPageUrl).get(); 
      pageTitle = htmlDocument.title(); 
      Log.i(TAG, "PAGETITLE" + pageTitle); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     finishListener.processFinish(true); 
     //do something 
    } 
} 

そしてリスナー:

new JsoupAsyncTask(new JsoupAsyncTask.FinishListener() { 
@Override 
public void processFinish(Boolean isFinish) { 
     // do somthing } 
     }).execute(); 
関連する問題