setContentView不可用于AsyncTask

时间:2016-02-13 14:40:12

标签: java android android-asynctask

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

谢谢

2 个答案:

答案 0 :(得分:2)

其实你只回答了你的问题&#34; 未在其范围内解决&#34;真的是。
试试这个

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,那么使用interface作为回调并在活动中更新UI内容。
  3. 重要:您只能从UI线程和Activity更新UI。

答案 1 :(得分:0)

当您从onPostExecute()更新UI时,我认为您不需要调用runOnUiThread()。但是你需要在super.onCreate()之后使用setContentView()。