我制作了非常简单的应用。基本上我有活动A,如果按下按钮则启动活动B.所以这里是代码
openMapFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), MapActivity.class);
intent.putExtra("routeId", id);
startActivity(intent);
}
});
但这就是问题所在。活动B很重(它基本上是打开地图(mapsforge)并做其他繁重的计算)。因此,当按下按钮时,我的UI会冻结大约4秒,然后我会打开活动B.我想展示一些动画,比如圈子进度条或类似的东西。那么是否可以在UI线程中启动活动?
这是我到目前为止所尝试的内容
new Thread(new Runnable() {
@Override
public void run() {
while (progressStatus < 100) {
progressStatus += 25;
handler.post(new Runnable() {
@Override
public void run() {
//animation code
}
});
try {
Thread.sleep(1600);
if (progressStatus == 100){
Intent intent = new Intent(getActivity(), MapActivity.class);
intent.putExtra("routeId", id);
startActivity(intent);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
然而,这并不是我所需要的。任何解决方案或建议?
答案 0 :(得分:0)
1)因此可以不在UI线程中启动活动
应仅在主UI线程中处理活动。您将无法在其他线程中启动活动。即使在后台线程中处理数据之后,也可以使用runOnUiThread
来调用或推送活动方法
如果您在主线程中执行长时间操作,Android将抛出ANR
2)然而,这并不是我所需要的。任何解决方案或 建议?
现在,另一种方法是使用AsyncTask或IntentService在后台对您的活动进行大量操作,并显示进度条直到这些操作完成。
完成此操作后,将数据发布到MapActivity。
1)Sample Intent Service implementation
onCreate上的AsyncTask示例如下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new BackAsync().execute("URL");
}
private String getURLDetailsTitle(String url) {
//Retrieve data from external URL
}
//AsyncTask to fetch data from URL called inside onCreate
private class BackAsyncextends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... urls) {
String str = getURLDetailsTitle(urls[0]);
while(true) {
publishProgress(str);
}
return str;
}
@Override
protected void onProgressUpdate(String... progress) {
//update progress
}
protected void onPostExecute(Long result) {
//update UI changes
}
答案 1 :(得分:0)
使用AsyncTask并在doInBackground方法中启动进度条并在onPostExecute方法中关闭它。