为什么我的textview更新?

时间:2016-05-01 17:10:11

标签: android android-asynctask textview

所以我有一个textview,我试图从asynctask更新。我想要更新它以正确打印到控制台的消息但由于某种原因它不会更新文本视图。以下是相关的代码:

    ko.bindingHandlers.getLocalizedScreenshot = 
{
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext)
    {
        var languageIndex = self.displayLanguages.indexOf(self.currentLanguage());
        var array = ko.observableArray(languageIndex>valueAccessor().length-1? valueAccessor()[0] : valueAccessor()[languageIndex] , allBindingsAccessor);            
        return ko.bindingHandlers.foreach.init(element, array, allBindingsAccessor, viewModel, bindingContext);
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext)
    {
        var languageIndex = self.displayLanguages.indexOf(self.currentLanguage());
        var array = ko.observableArray(languageIndex>valueAccessor().length-1? valueAccessor()[0] : valueAccessor()[languageIndex] , allBindingsAccessor);
        ko.bindingHandlers.foreach.update(element, array , allBindingsAccessor, viewModel, bindingContext);
        return { controlsDescendantBindings: true };       
    }
};

我在这里声明了textview,然后在onCreate()方法中指定它:

* @param \phpbb\request\request => $request
* @param \phpbb\template\template => $template
* @param \phpbb\user => $user
* @param \phpbb\auth\auth => $auth
* @param \phpbb\db\driver\driver => $db
* @param \phpbb\config\config => $config

然后在我的asynctask中,我有这个片段,每次向MQTT发布新消息时都会运行:

public class MainActivity extends AppCompatActivity{
    private MqttClient client;
    private String clientId = MqttClient.generateClientId();
    private TextView tv;
    ...

该消息正确地打印了我想要它到控制台的方式,但它没有更新文本视图,我不知道为什么。

2 个答案:

答案 0 :(得分:1)

确保在UI线程上调用回调messageArrived

在后台线程中,您可以写入日志,但无法更新UI元素(如文本框)。

您可以使用runOnUIThread

在UI线程上运行后台任务中的代码
    runOnUiThread(new Runnable() 
    {       
        public void run() 
        {
            // update UI code
        }
    });

在您的情况下,这意味着移动回调调用(例如callback.messageArrived(..))或从runnable

设置textview(tv.setText("testing");

答案 1 :(得分:1)

您应该更新TextView onPostExecute()中的AsyncTask

这是一个例子

protected void onPostExecute(Prams) {

    tv = (TextView) findViewById(R.id.textView5);

    tv.setText("testing");
}

关键在于您将protected doInBackground(Params)的结果传递给onPostExecute(),它会在UiThread上更新您的观看次数。

希望有所帮助