我有一个带有TextView的启动画面来显示应用程序正在执行的操作,例如“正在更新库”...“正在更新运输”......等我正在使用AsyncTask通过API更新我的数据库。< / p>
我将更新文本传递给AsyncTask。我需要更改TextView statusMessage
中的文字。我正试图这样做:
public class JSONParser extends AsyncTask<String, String, JSONObject> {
static InputStream is = null;
static JSONObject json = null;
static String outPut = "";
TextView statusMessage;
@Override
protected void onPreExecute() {
statusMessage = (TextView) findViewById(R.id.statusMessage);
}
...
我的计划是更改doInBackground
方法中的文本,但在AsyncTask中无法访问findViewById
。我想我需要使用setContentView
来允许findViewById
工作,但我不确定如何。
我的java文件是SplashScreen.java
,我的xml是activity_splash_screen.xml
-----编辑-----
有关更多信息,我有三件相互交谈:
SplashScreen.java - &gt;调用baseActivity.java中的方法 - &gt;方法将数据发送到JSONParser.java - &gt;将解析后的JSON从API发送到baseActivity.java以更新数据库
根据以下建议我已宣布
statusMessage = (TextView) findViewById(R.id.statusMessage);
在baseActivity.java的onCreate中,因为它是调用AsyncTask的文件。
在JSONParser.java中我已经完成了这个,现在:
public class JSONParser extends AsyncTask<String, String, JSONObject> {
static InputStream is = null;
static JSONObject json = null;
static String outPut = "";
TextView statusMessage;
@Override
protected JSONObject doInBackground(String... params) {
// TODO Auto-generated method stub
...
}
protected void onProgressUpdate() {
statusMessage.setText("testing");
}
protected void onPostExecute(JSONObject result) {
}
}
我只是在那里使用“测试”进行测试。
答案 0 :(得分:3)
我的计划是更改doInBackground中的文本
糟糕的计划!您无法从后台UI
更新Thread
。您需要在onPostExecute()
或onProgressUpdate()
。
但是在AsyncTask中无法访问findViewById。
如果这是Activity
的内部类,则初始化View
中的Activity
,然后按照上述说明在您的任务中更新它。
如果它是自己的文件,那么您需要使用interface
并回复Acitivty
,onPostExecute()
或onPreExecute()
中的onProgressUpdate()
}。您可以看到in this SO answer的示例。
我想我需要使用setContentView来允许findViewById
当然!但如上所述,请在执行任务之前执行此操作,例如onCreate()
的{{1}}。
修改强>
Activity
需要onProgressUpdate()
,但您的param
不是,所以它不是同一种方法。这就是为什么当你有onProgressUpdate()
这是注释点时抱怨的原因。它抱怨并且你知道你认为你要覆盖一种方法,所以你知道它有问题。
将其更改为
@Override
protected void onProgressUpdate(Void...values) {
statusMessage.setText("testing");
}
链接
http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
答案 1 :(得分:1)
你应该使用onProgressUpdate,该方法可以访问ui线程。
public class yourAsync extends AsyncTask<> {
@Override
protected void onProgressUpdate() {
textView.setText();
}
}
答案 2 :(得分:1)
在你的活动中加入这样的东西
处理程序statusUpdateHandeler = new Handler()........
在你的线程中,调用处理程序(发送消息)
MainActivity.statusUpdateHandler.sendEmptyMessage(1);
在您的实际处理程序代码中,设置状态消息。
答案 3 :(得分:0)
I think I need to use setContentView to allow findViewById to work but I'm not sure how.
是。您需要在onCreate中使用setContentView(R.layout.activity_splash_screen)
。
您可以在onCreate中初始化视图make asynctask是一个内部活动类,并在onPreExecute
中更新ui。
TextView statusMessage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
statusMessage = (TextView) findViewById(R.id.statusMessage);
}
您还可以使用progressdialog并显示消息。我认为使用progressdialog比textview更好。您可以在onProgressUpdate()
中发布doInbackground中的进度并更新进度对话框http://developer.android.com/reference/android/os/AsyncTask.html