在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的主要内容,如果未能解决你的问题,请参考以下文章