【问题标题】:setContentView unavailable from AsyncTasksetContentView 在 AsyncTask 中不可用
【发布时间】:2016-02-13 14:40:12
【问题描述】:

我正在 Android 上编写一个 java 应用程序。 我有一个 Activity,它启动一个 AsyncTask 以便从服务器获取数据并呈现它。

我正在尝试在 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);
       }
   }
}

谢谢

【问题讨论】:

  • 你有两个独立的类 1 用于 Activity 和 1 用于 AsyncTask 吗?
  • 是的,我有 2 个单独的课程

标签: java android android-asynctask


【解决方案1】:

实际上,您只回答了您的问题“在其范围内未解决”,确实如此。
试试这个

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);
        }

    }

}
  1. 在活动内部声明 AsyncTask,以便访问所有活动方法。
  2. 或者,如果您在单独的类中有 AsyncTask,则使用接口作为回调并在活动中更新 UI 内容。

重要提示:您只能从 UI 线程和 Activity 更新 UI。

【讨论】:

  • 这个是正确的 - 与前两个答案不同。
  • 非常感谢!!!我按照您的示例将 AsyncTask 作为内部类放在 Activity 中,它可以工作!!
【解决方案2】:

我认为从 onPostExecute() 更新 UI 时不需要调用 runOnUiThread()。但是在 super.onCreate() 之后确实需要 setContentView()。

【讨论】:

  • 问题是 setContentView()(OP 想要使用的)不能从 AsyncTask 获得,所以这也不起作用。我也很确定您不需要super.on create(..) 之后立即致电setContentView() - 您可以随时致电。
  • 也许它不可用,因为您需要在上下文中调用它?或者你可以在 super.onCreate() 之后使用一些膨胀的布局调用 setContentView(),比如说 TableLayout,来自 xml,然后在 onPost 中添加行...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多