在 Android 中,如何从 AsyncTask 更改 TextView? [复制]
Posted
技术标签:
【中文标题】在 Android 中,如何从 AsyncTask 更改 TextView? [复制]【英文标题】:In Android, How do I change the TextView from an AsyncTask? [duplicate] 【发布时间】:2014-02-01 15:51:04 【问题描述】:我有一个带有 TextView 的初始屏幕,用于显示应用程序正在执行的操作,例如“更新库”...“更新运输”...等等。我正在使用 AsyncTask 通过 API 更新我的数据库。
我正在将更新文本传递给 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 -> 调用 baseActivity.java 中的方法 -> 方法将数据发送到 JSONParser.java -> 将解析后的 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)
我只是在此处使用“测试”来进行测试。
【问题讨论】:
您可以使用 Handler 来更新 TextView(需要在 UI 线程上发布更新)。 【参考方案1】:我的计划是更改 doInBackground 中的文本
糟糕的计划!您无法从背景 Thread
更新 UI
。您需要在onPostExecute()
或onProgressUpdate()
中执行此操作。
但在 AsyncTask 中无法访问 findViewById。
如果这是您的Activity
的内部类,则在Activity
中初始化View
,然后如上所述在您的任务中更新它。
如果它是它自己的文件,那么您将需要使用interface
并在onPostExecute()
、onPreExecute()
或onProgressUpdate()
中回调Acitivty
。你可以看到in this SO answer的一个例子。
我想我需要使用 setContentView 来允许 findViewById
绝对!但是如上所述,在任务之前执行此操作,例如在您的Activity
中的onCreate()
。
编辑
onProgressUpdate()
采用 param
但您的 onProgressUpdate()
没有,因此它不是同一种方法。这就是为什么当你有 @Override
时它抱怨的原因,这是注释的重点。它会抱怨,你知道你应该覆盖一个方法,所以你知道它有问题。
改成
protected void onProgressUpdate(Void...values)
statusMessage.setText("testing");
onProgressUpdate()
链接
http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
【讨论】:
我已经用我最近的更改更新了这个问题。但是,文本尚未更改。我错过了一块吗? 是的,我没有看到statusMessage
在任何地方初始化。无论如何,您需要使用我链接到的回调/接口方法或将AsyncTask
设为您的初始Acitivity
的内部类。
我在调用 JSONParser.java 中的 AsyncTask 的“baseActivity.java”的 onCreate 中对其进行了初始化。我尝试初始化它 JSONParser.java 但这就是我遇到问题的地方。
是的,因为您的AsyncTask
无权访问它。按照我之前评论中的两个建议之一,你会没事的。生活将再次盛大......我保证!
似乎让它成为一个内部类是对冲成为最好的路线。除了初始屏幕之外,不会在其他任何地方进行这些调用。将 AsyncTask 保存在不同的文件中主要是为了以后更容易维护,仅此而已。【参考方案2】:
你应该使用onProgressUpdate,该方法可以访问ui线程。
public class yourAsync extends AsyncTask<>
@Override
protected void onProgressUpdate()
textView.setText();
【讨论】:
ADT 要我删除@Override
【参考方案3】:
在你的活动中加入类似的东西
处理程序状态UpdateHandeler = new Handler()........
在您的线程中,调用处理程序(向其发送消息)
MainActivity.statusUpdateHandler.sendEmptyMessage(1);
在您的实际处理程序代码中,设置状态消息。
【讨论】:
【参考方案4】: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 中初始化视图,使 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 会比textview 更好。您可以在 doInbackground 中发布进度并在 onProgressUpdate() 中更新进度对话框
http://developer.android.com/reference/android/os/AsyncTask.html
【讨论】:
我没有在启动画面活动中调用 AsycnTask。我已经更详细地更新/编辑了我的问题。 @dcp3450 要么使其成为内部类,要么使用接口回调到活动并在活动中更新用户界面以上是关于在 Android 中,如何从 AsyncTask 更改 TextView? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 android 中的 AsyncTask 获取 UI 参考
如何从 Android AsyncTask 更改活动 UI?