在AsyncTask中更新UI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在AsyncTask中更新UI相关的知识,希望对你有一定的参考价值。

我的android项目遇到了Jsoup的问题。我有一个获取数据然后将数据放入gui的方法。我遇到的问题是它不等待检索数据。我使用get数据方法将后台方法和使用该数据的post方法放在AsyncTask中。背景方法的返回是具有来自jsoup方法的信息的对象的arraylist。

我无法添加我正在处理的代码,但我在示例项目中添加了类似的代码。有同样的问题。

代码示例主要活动

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

对不起之前没有添加代码,希望这是有道理的:)

答案

Your poblem

由于AsyncTask#doInBackground在另一个线程而不是主线程中运行,因此您的结果不会立即返回。这是非常正常的,因为主线程不应该被阻塞。简单地说,在另一个线程中执行长时间任务并更新主线程中的UI。

How to solve it

    /**
    * <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方法。 param Result result是你从doInBackground返回的。任何困惑你都可以问我。

以上是关于在AsyncTask中更新UI的主要内容,如果未能解决你的问题,请参考以下文章

在AsyncTask中更新UI

在 AsyncTask 完成之前不会绘制 UI

用 Asynctask 更新 FragmentTransaction 替换的片段

Asynctask 内部类不更新 UI 文本视图

什么是生命周期感知方式来实现重复的AsyncTask?

android asynctask怎么用