Java setContentView在AsyncTask中不可用

Java setContentView在AsyncTask中不可用,java,android,android-asynctask,Java,Android,Android Asynctask,我正在Android上编写java应用程序。 我有一个活动,它启动一个异步任务,以便从服务器获取数据并显示数据 我试图在onPostExecute()方法中表示数据,但是setContentView&populateUI(getApplicationContext())在其作用域中没有解析。 为什么? 如果运行这样的代码,而不添加setContentView,则在执行结束时会出现一个空屏幕。没有出现异常 public class CurrencyRatesActivity extends Act

我正在Android上编写java应用程序。 我有一个活动,它启动一个异步任务,以便从服务器获取数据并显示数据

我试图在onPostExecute()方法中表示数据,但是setContentView&populateUI(getApplicationContext())在其作用域中没有解析。 为什么?

如果运行这样的代码,而不添加setContentView,则在执行结束时会出现一个空屏幕。没有出现异常

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个用于异步任务?是的,我有两个单独的类。这一个是正确的-与前面的两个答案不同。非常感谢!!!我按照您的示例,将异步任务作为内部类放在活动中,并将其作品