Java setContentView在AsyncTask中不可用
我正在Android上编写java应用程序。 我有一个活动,它启动一个异步任务,以便从服务器获取数据并显示数据 我试图在onPostExecute()方法中表示数据,但是setContentView&populateUI(getApplicationContext())在其作用域中没有解析。 为什么? 如果运行这样的代码,而不添加setContentView,则在执行结束时会出现一个空屏幕。没有出现异常Java setContentView在AsyncTask中不可用,java,android,android-asynctask,Java,Android,Android Asynctask,我正在Android上编写java应用程序。 我有一个活动,它启动一个异步任务,以便从服务器获取数据并显示数据 我试图在onPostExecute()方法中表示数据,但是setContentView&populateUI(getApplicationContext())在其作用域中没有解析。 为什么? 如果运行这样的代码,而不添加setContentView,则在执行结束时会出现一个空屏幕。没有出现异常 public class CurrencyRatesActivity extends Act
public class CurrencyRatesActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new ReadCurrencyRateTask(this).execute("http://currency.xml");
}
}
public class ReadCurrencyRateTask extends AsyncTask<String, Integer, Integer>
{
private Context mainActivityContext;
public ReadCurrencyRateTask(Context mainActivityContext)
{
super();
this.mainActivityContext = mainActivityContext;
}
public Integer doInBackground(String... url)
{
// do some culculations
.......
return status;
}
protected void onPostExecute(Integer result)
{
// In case connection succeeded
TableLayout tbl = new TableLayout(mainActivityContext);
tbl.setStretchAllColumns(true);
tbl.bringToFront();
for (int i=0; i<currencyList.size(); i++)
{
TableRow tr = new TableRow(mainActivityContext);
TextView country = new TextView(mainActivityContext);
country.setText("...something...");
tr.addView(country);
}
}
}
公共类CurrencyRatesActivity扩展活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
新建ReadCurrencyRateTask(此)。执行(“http://currency.xml");
}
}
公共类ReadCurrencyRateTask扩展了AsyncTask
{
私有上下文mainActivityContext;
公共ReadCurrencyRateTask(上下文mainActivityContext)
{
超级();
this.mainActivityContext=mainActivityContext;
}
公共整数doInBackground(字符串…url)
{
//做一些练习
.......
返回状态;
}
受保护的void onPostExecute(整数结果)
{
//以防连接成功
TableLayout tbl=新的TableLayout(mainActivityContext);
tbl.SetStretCharl列(真);
tbl.bringToFront();
对于(int i=0;i我认为当您从onPostExecute()更新UI时,不需要调用runOnUiThread()。但是在super.onCreate()之后需要setContentView()。实际上,您只回答了“未在其范围内解决”的问题,事实上确实如此。
试试这个
public class CurrencyRatesActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new ReadCurrencyRateTask(this).execute("http://currency.xml");
}
class ReadCurrencyRateTask extends AsyncTask<String, Integer, Integer> {
//your network stuff goes here
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
//your stuff
setContentView(yourView);
}
}
}
公共类CurrencyRatesActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
新建ReadCurrencyRateTask(此)。执行(“http://currency.xml");
}
类ReadCurrencyRateTask扩展了AsyncTask{
//你的网络资料在这里
@凌驾
受保护的void onPostExecute(整数){
onPostExecute(整数);
//你的东西
设置内容视图(yourView);
}
}
}
在活动内声明AsyncTask,以便访问所有活动方法
或者,若在单独的类中有AsyncTask,那个么将接口用作回调,并在活动中更新UI内容
重要:您只能从UI线程和活动更新UI。问题是setContentView()
(OP想要使用的)在异步任务中不可用,因此这也不起作用。我还非常确定,您不需要在super.on创建(..)之后立即调用setContentView()
-您可以随时调用它。它可能不可用,因为您需要在上下文中调用它?或者您可以在super.onCreate()之后调用setContentView()使用一些膨胀的布局,比如说TableLayout,从xml开始,然后在onPost中添加行……您有两个单独的类吗?1个用于活动,1个用于异步任务?是的,我有两个单独的类。这一个是正确的-与前面的两个答案不同。非常感谢!!!我按照您的示例,将异步任务作为内部类放在活动中,并将其作品