我在这里抓到了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。使这项工作最简单的方法是什么?
答案 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();
}
}