我目前正致力于项目。它涉及持续从云服务器读取数据。我正在使用ubidots服务器。目前我创建的类扩展到asynctask类,如此
public class ApiUbidots extends AsyncTask<Integer, Void, Void> {
private final String API_KEY = "1XXXXXXXXX";
private static final String tempID = "56XXXXXXXX";
@Override
protected Void doInBackground(Integer... params) {
final ApiClient apiClient = new ApiClient(API_KEY);
Variable tempVariable = apiClient.getVariable(tempID);
Value[] tempValues = tempVariable.getValues();
Double vlStr = tempValues[0].getValue();
String tempValue = String.valueOf(vlStr);
Log.i(TAG, "TEMPERATURE VALUE IS ====" + tempValue);
tempTextView.setText(tempValue);
return null;
}
}
现在我正在尝试将我从服务器获取的值设置为在textview上显示但我无法在此类中设置。
我需要找到一种方法,只要数据变量发生变化就必须改变textview
任何人都可以帮助我如何继续工作。 谢谢!
答案 0 :(得分:1)
如果将此类定义为子类,则需要做的就是在AsyncTask的onPostExecute()
方法中更新TextView。如果此任务是单独文件中的类,则应定义回调以将数据发送回调用Activity,然后使用回调中收到的数据更新TextView。这是一些示例代码:
您的AsyncTask看起来像这样。请注意,它定义了一个公共接口,用作任务结果的回调。
import android.os.AsyncTask;
public class TestTask extends AsyncTask<String, Void, String> {
TestTaskCallback listener;
public TestTask(TestTaskCallback listener) {
this.listener = listener;
}
protected String doInBackground(String... args) {
String input = args[0];
String output = "simulated return value";
return output;
}
protected void onPostExecute(String result) {
listener.onResultReceived(result);
}
public interface TestTaskCallback {
void onResultReceived(String result);
}
}
然后你的调用Activity将实现回调,触发Task,然后等待结果,如下所示:
public class TestActivity extends AppCompatActivity implements TestTask.TestTaskCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
new TestTask(this).execute("Some input");
}
public void onResultReceived(String result) {
Log.d("TEST TASK RESULT", result);
}
}
一旦结果出现,您可以在Activity中使用它来更新TextView。正如我上面提到的,如果你只是在Activity本身中继承Task,这就更容易了。这样,您就可以直接从任务访问TextView。此时无需乱搞回调。