Android网络线程和视图/ gui更新

时间:2013-12-15 00:16:20

标签: android

我在这里抓到了22个。如果我使用AsyncTask来运行我的网络活动,我无法从该线程更新我的用户界面。

MainActivity.onCreate(...){
   myAsyncTask.execute();
   //E/AndroidRuntime(1177): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
}

网络活动将是连续的,需要在不同的线程上进行。所以,我转向super.runOnUiThread来解决上面的错误,因为它接受Runnable作为参数。不幸的是,Javadocs并不清楚,我不知道super.runOnUiThread是要创建一个Thread还是直接调用run。显然它不会创建一个Thread,因为我得到了这个例外:android.os.NetworkOnMainThreadException

鉴于我有一个需要连接的单屏App。使这项工作最简单的方法是什么?

2 个答案:

答案 0 :(得分:1)

  

如果我使用AsyncTask来运行我的网络活动,我无法从该线程更新我的用户界面

这就是AsyncTask onPostExecute()的原因。将您的UI更新逻辑放在那里(或onProgressUpdate(),如果您希望在后台工作进行时更新UI。)

答案 1 :(得分:0)

正如CommonsWare所说,你可以使用onProgressUpdate()来更新你的UI。这是一个例子,我用它来制作一个很酷的启动画面。

https://www.dropbox.com/s/cyz7112k4m1booh/1.png

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    bar=(ProgressBar) findViewById(R.id.progressBar);
    new PrefetchData().execute();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.splash, menu);
    return true;
}


 private class PrefetchData extends AsyncTask<String,String,String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // before making http calls         

        }

        @Override
        protected String doInBackground(String... arg0) {
         Random ran=new Random();
         int count;
         int total=0;
         try {
              while(total <= 100){
               count=ran.nextInt(30);
               total+=count;                 
               Thread.sleep(1000);
               if (total >= 100) publishProgress(""+100);
      //here publishProgress() will invoke onProgressUpdate() automatically .
                 else publishProgress(""+(int) total);
               }
             }catch (InterruptedException e) {
                e.printStackTrace();
                Log.e("Error:",e.getMessage());
            }
         return null;
        }

        protected void onProgressUpdate(String... progress) {
            bar.setProgress(Integer.parseInt(progress[0]));
       }


        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Intent i = new Intent(SplashActivity.this, MainActivity.class);            
            startActivity(i);

            finish();
        }

    }