2017-12-23 16 views
-3

내 안드로이드 프로젝트에 Jsoup에 문제가 있습니다. 데이터를 가져 와서 그 데이터를 GUI에 저장하는 메소드가 있습니다. 문제는 내가 데이터를 검색 할 때까지 기다릴 필요가 없다는 것입니다. 나는 AsyncTask에 배경 메서드를 사용하여 get 데이터 메서드를 사용하고 해당 데이터를 사용하는 post 메서드에 넣습니다. 백그라운드 메소드에 대한 리턴은 jsoup 메소드의 정보가있는 객체의 arraylist입니다.AsyncTask의 UI 업데이트

내가 작업하고있는 코드를 추가 할 수 없지만 예제 프로젝트에 비슷한 코드를 추가했습니다. 같은 문제.

코드 예제의 주요 활동

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    TextView textView = findViewById(R.id.exampleTextview); 

    ArrayList<ExampleObject> arrayList = new ArrayList<>(); 

    JsoupClass jsoupClass = new JsoupClass(); 

    arrayList = jsoupClass.getStaffinfomation(arrayList, "examplename"); 

    textView.setText(arrayList.get(0).getName()); 
} 
} 

Jsoup 클래스 예 :

public class JsoupClass { 


public ArrayList<ExampleObject> getStaffinfomation(final ArrayList<ExampleObject> emptyArray, final String infoFind){ 
    class getStaff extends AsyncTask<ArrayList<ExampleObject>, Void , ArrayList<ExampleObject>> { 

     @Override 
     protected ArrayList<ExampleObject> doInBackground(ArrayList<ExampleObject>[] arrayLists) { 

      Document doc = Jsoup.connect(Config.ExampleURL).get(); 

     } 
      Elements tableRows = doc.select("tr"); 
      for(int i = 0; i < tableRows.size(); i++) { 


       if (tableRows.get(i).text().contains(infoFind)) { 
        //Store the information as a object 
        String fullname = tableRows.get(i).select("td").get(0).select("a").text(); 

        emptyArray.add(new ExampleObject(fullname)); 




        } 
       } 
      } 

      getStaff getStaff = new getStaff(); 
      getStaff.execute(); 
      return null; 

     } 
} 

객체 클래스

public class ExampleObject { 
private String name; 
public ExampleObject(String name){ 
    this.name = name; 
} 

public String getName(){ 
    return name; 
} 
} 

죄송합니다 전에 코드를 추가하지 않는 경우,이 말이 :)

을 만드는 희망
+1

문제가있는 코드를 추가하십시오. 이 시점에서 우리는 단지 추측 할 것입니다. – Barns

+0

@Barns 코드를 추가했습니다. 추가하지 않으 셨다니 죄송합니다. – Darren

답변

2

귀하의 포블

AsyncTask#doInBackground 메인 스레드가 아닌 다른 스레드에서 실행되기 때문에 결과가 즉시 반환되지 않습니다. 메인 스레드가 차단되어서는 안되기 때문에 매우 정상입니다. 간단히 말해서, 다른 스레드에서 오랜 시간 작업을하고 메인 스레드에서 UI를 업데이트하십시오. 보시다시피이

/** * <p>Runs on the UI thread after {@link #doInBackground}. The * specified result is the value returned by {@link #doInBackground}.</p> * * <p>This method won't be invoked if the task was cancelled.</p> * * @param result The result of the operation computed by {@link #doInBackground}. * * @see #onPreExecute * @see #doInBackground * @see #onCancelled(Object) */ @SuppressWarnings({"UnusedDeclaration"}) @MainThread protected void onPostExecute(Result result) { } 

, 당신은 onPostExecute 방법을 구현할 수있는 해결 방법

. 매개 변수 Result resultdoInBackground에서 반환하는 것입니다. 너 혼란스러워서 나 한테 물어볼 수있어.