gpt4 book ai didi

android - 从使用自定义程序对话框的异步任务更新 TextView

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:48:24 24 4
gpt4 key购买 nike

在我的一个应用程序中,我有一个场景需要执行一些后台任务。为此,我正在使用异步任务。我也在使用自定义进度对话框。下面是自定义进度对话框的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:orientation="vertical" >

<ProgressBar
android:layout_width="60dp"
android:layout_height="60dp"
android:indeterminateDrawable="@drawable/progressloader"
android:layout_gravity="center"/>

<TextView
android:id="@+id/progressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="18sp"
android:text="Please wait...." />

</LinearLayout>

一切正常,但当我尝试将文本设置为 TextView 时,出现 java NullPointerException。

异步任务代码

private class InitialSetup extends AsyncTask<String, Integer, Long> {

ProgressDialog dialog = new ProgressDialog(getParent(),R.style.progressdialog);


@Override
protected void onPreExecute() {
dialog.show();
dialog.setContentView(R.layout.progressbar);

}

@Override
protected Long doInBackground(String... urls) {
// txtView.setText("Testing"); here I am getting the error
fetchDetails();

return 0;
}

@Override
protected void onPostExecute(Long result) {

if (this.dialog.isShowing()) {
this.dialog.dismiss();
}

populateUI(getApplicationContext());
}
}

主要 Activity

public class SummaryActivity extends Activity {


final TextView txtView = (TextView)findbyid(R.id.progressMessage);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.accountsummary);

new InitialSetup().execute("");

}
}

最佳答案

如果我理解正确,你想要设置文本的 TextView 可以在 xml 文件 progressbar.xml 中找到(即 R.layout.progressbar) .一旦设置了内容 View (使用 setContentView()),就可以获得此 TextView。在你的代码中,你在这个调用之前设置它,而 mussharapp 的代码,他提前调用它。即,他在不包含 TextViewsetContentView(R.layout.accountsummary) 调用之后调用它。因此,变量 txtView 将为 NULL,您将得到一个 NullPointerException

你应该做的是:

  • setContentView 调用后,在 onPreExecute 中设置变量 txtView。
  • 基于 Paresh Mayani 的 explanation : 使用 runOnUiThread 方法。

代码如下:

private class InitialSetup extends AsyncTask<String, Integer, Long> {

ProgressDialog dialog = new ProgressDialog(getParent(),R.style.progressdialog);
// The variable is moved here, we only need it here while displaying the
// progress dialog.
TextView txtView;

@Override
protected void onPreExecute() {
dialog.show();
dialog.setContentView(R.layout.progressbar);
// Set the variable txtView here, after setContentView on the dialog
// has been called! use dialog.findViewById().
txtView = dialog.findViewById(R.id.progressMessage);
}

@Override
protected Long doInBackground(String... urls) {
// Already suggested by Paresh Mayani:
// Use the runOnUiThread method.
// See his explanation.
runOnUiThread(new Runnable() {
@Override
public void run() {
txtView.setText("Testing");
}
});

fetchDetails();
return 0;
}

@Override
protected void onPostExecute(Long result) {

if (this.dialog.isShowing()) {
this.dialog.dismiss();
}

populateUI(getApplicationContext());
}
}

关于android - 从使用自定义程序对话框的异步任务更新 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com