Android 跳过98帧!应用程序可能在其主线程上做了太多工作
我有导航抽屉和导航菜单。单击每个导航菜单时,会打开特定的片段。每个片段显示从SQLite外部数据库获取数据的RecylerView。现在,当打开新片段时,必须等待几秒钟;当单击每个项目以转到下一个活动以显示有关该项目的详细信息时,必须等待5秒钟以打开详细信息活动。我知道这是在主线程中获取数据和在主线程中获取位图的问题。但我不知道如何使用use AsyncTask解决此问题。我的最大问题是打开一个新活动以显示信息并等待5秒钟 这是我的亚洲碎片。 AsiaFragmentAndroid 跳过98帧!应用程序可能在其主线程上做了太多工作,android,multithreading,sqlite,Android,Multithreading,Sqlite,我有导航抽屉和导航菜单。单击每个导航菜单时,会打开特定的片段。每个片段显示从SQLite外部数据库获取数据的RecylerView。现在,当打开新片段时,必须等待几秒钟;当单击每个项目以转到下一个活动以显示有关该项目的详细信息时,必须等待5秒钟以打开详细信息活动。我知道这是在主线程中获取数据和在主线程中获取位图的问题。但我不知道如何使用use AsyncTask解决此问题。我的最大问题是打开一个新活动以显示信息并等待5秒钟 这是我的亚洲碎片。 AsiaFragment public class
public class AsiaFragment extends Fragment {
private static final String ASIA_FRAGMENT = "asia_fragment";
ArrayList<AsiaCountry> asiaCountries = new ArrayList<>();
ContentAdapter contentAdapter;
RecyclerView recyclerView;
private boolean isListView;
private Menu menu;
private StaggeredGridLayoutManager staggeredGridLayoutManager;
private MyAsyncTas myAsyncTas;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.asia_fragment, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
getActivity().setTitle("Asia");
isListView = true;
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
new MyAsyncTas().execute();
}
// When click on grid icon, view items must be convert to grid.
public void toggle() {
MenuItem item = menu.findItem(R.id.grid);
if (isListView) {
staggeredGridLayoutManager.setSpanCount(2);
item.setIcon(R.drawable.ic_vertical);
item.setTitle("Show as list");
isListView = false;
} else {
staggeredGridLayoutManager.setSpanCount(1);
item.setIcon(R.drawable.ic_grid);
item.setTitle("Show grid");
isListView = true;
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.grid_item, menu);
this.menu = menu;
Log.d("Menu created", "grid");
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.grid) {
Toast.makeText(getActivity(), "Grid item touched", Toast.LENGTH_SHORT).show();
toggle();
return true;
}
if (id == R.id.settings) {
Toast.makeText(getActivity(), "Setting clicked", Toast.LENGTH_SHORT).show();
return true;
}
return onOptionsItemSelected(item);
}
// When loading AsiaFragment, database loading from Eternal database.
public void loadDataBase() {
WorldCountryDatabase worldCountryDatabase = new WorldCountryDatabase(getActivity());
try {
worldCountryDatabase.createDatabase();
worldCountryDatabase.openDataBase();
Log.d("TAG", "Database open");
} catch (SQLiteException o) {
o.printStackTrace();
Log.d("Tag", o.getMessage());
}
try {
// Tell to database , take name and viewImage from worldCountries .
Cursor cursor = worldCountryDatabase.QueryData("SELECT name, Image FROM country WHERE continent ='آسیا'");
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
AsiaCountry asiaCountry = new AsiaCountry();
asiaCountry.setName(cursor.getString(0));
asiaCountry.setFlag(cursor.getString(1));
Log.d(ASIA_FRAGMENT, cursor.getString(1));
asiaCountries.add(asiaCountry);
} while (cursor.moveToNext());
worldCountryDatabase.close();
}
}
} catch (SQLiteException o) {
o.printStackTrace();
Log.d("TAG", o.getMessage());
}
// When loading RecylerView staggeredGridLayout loading.
staggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
contentAdapter = new ContentAdapter(getActivity(), asiaCountries);
contentAdapter.notifyDataSetChanged();
contentAdapter.setListener(new ContentAdapter.Listener() {
@Override
public void onClick(int position) {
}
});
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
recyclerView.setAdapter(contentAdapter);
}
public class MyAsyncTas extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
return true;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
loadDataBase();
}
}
公共类AsiaFragment扩展片段{
私有静态最终字符串ASIA\u FRAGMENT=“ASIA\u FRAGMENT”;
ArrayList asiaCountries=新的ArrayList();
内容适配器;
回收视图回收视图;
私有布尔isListView;
私人菜单;
私人StaggedGridLayoutManager StaggedGridLayoutManager;
私有MyAsyncTas MyAsyncTas;
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
设置选项菜单(真);
}
@凌驾
创建视图上的公共视图(布局、充气机、最终视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.asia_碎片,容器,错误);
recyclerView=(recyclerView)view.findViewById(R.id.recyclerView);
getActivity().setTitle(“亚洲”);
isListView=true;
返回视图;
}
@凌驾
已创建视图上的公共void(视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
新建MyAsyncTas().execute();
}
//单击网格图标时,视图项必须转换为网格。
公共无效切换(){
MenuItem=menu.findItem(R.id.grid);
如果(isListView){
交错排列布局管理器。设置计数器(2);
项目.设置图标(R.可绘制.ic_垂直);
项目。设置标题(“显示为列表”);
isListView=false;
}否则{
StaggedGridLayoutManager.SetPanCount(1);
项目设置图标(R.可绘制ic_网格);
项目。设置标题(“显示网格”);
isListView=true;
}
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
充气机。充气(右菜单。网格项,菜单);
this.menu=菜单;
Log.d(“创建菜单”、“网格”);
super.onCreateOptions菜单(菜单,充气机);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.grid){
Toast.makeText(getActivity(),“网格项目已触摸”,Toast.LENGTH_SHORT.show();
切换();
返回true;
}
if(id==R.id.settings){
Toast.makeText(getActivity(),“单击设置”,Toast.LENGTH_SHORT.show();
返回true;
}
返回选项ItemSelected(项目);
}
//加载AsiaFragment时,从永久数据库加载数据库。
公共数据库(){
WorldCountryDatabase WorldCountryDatabase=新的WorldCountryDatabase(getActivity());
试一试{
worldCountryDatabase.createDatabase();
openDataBase();
Log.d(“标记”,“数据库打开”);
}捕获(SQLITEO异常){
o、 printStackTrace();
Log.d(“Tag”,o.getMessage());
}
试一试{
//告诉数据库,从worldCountries获取名称和视图图像。
Cursor Cursor=worldCountryDatabase.QueryData(“选择名称,来自大陆所在国家的图像=‘آسیا’”);
如果(光标!=null){
if(cursor.moveToFirst()){
做{
亚洲国家=新亚洲国家();
asiaCountry.setName(cursor.getString(0));
asiaCountry.setFlag(cursor.getString(1));
Log.d(ASIA_片段,cursor.getString(1));
亚洲国家。添加(亚洲国家);
}while(cursor.moveToNext());
worldcontrydatabase.close();
}
}
}捕获(SQLITEO异常){
o、 printStackTrace();
Log.d(“TAG”,o.getMessage());
}
//加载RecylerView时,请错开布局加载。
StaggedGridLayoutManager=新的StaggedGridLayoutManager(1,StaggedGridLayoutManager.VERTICAL);
contentAdapter=新的contentAdapter(getActivity(),asiaCountries);
contentAdapter.notifyDataSetChanged();
contentAdapter.setListener(新的contentAdapter.Listener(){
@凌驾
公共void onClick(内部位置){
}
});
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(StaggedGridLayoutManager);
recyclerView.setAdapter(contentAdapter);
}
公共类MyAsyncTas扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(Void…params){
返回true;
}
@凌驾
受保护的void onPostExecute(布尔aBoolean){
super.onPostExecute(aBoolean);
loadDataBase();
}
}
这是我的DetailCountry片段,必须在单击的国家/地区显示
详细信息中心
public class DetailsCountry extends AppCompatActivity implements
TabLayout.OnTabSelectedListener,
EconomicFragment.EconomicOnFragmentInteractionListener,
SummarizeFragment.SummarizeOnFragmentInteractionListener,
HistoryFragment.HistoryOnFragmentInteractionListener,
GeographyFragment.GeographyOnFragmentInteractionListener,
TipsFragment.TipsOnFragmentInteractionListener,
DescriptionFragment.OtherOnFragmentInteractionListener,
PeopleFragment.PeopleOnFragmentInteractionListener {
public static String NAME_COUNTRY = "name";
public final String pageTitle[] = {"خلاصه",
"تاریخ",
"جغرافی",
"اقتصاد",
"مردم",
"غیره",
"نکات"};
ArrayList<AsiaCountry> asiaList = new ArrayList<>();
ImageView imageHistory;
TabLayout tabLayout;
ViewPager viewPager;
String content;
Bundle bundle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detial_country);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_details);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
viewPager = (ViewPager) findViewById(R.id.viewPager_detail_country);
tabLayout = (TabLayout) findViewById(R.id.tabLayout_detail_country);
imageHistory = (ImageView) findViewById(R.id.image_detail_country);
bundle = getIntent().getExtras();
if (bundle != null) {
content = bundle.getString("name");
Log.d("contentDetail", content);
}
// Set title for activity title.
getSupportActionBar().setTitle(content);
retrieveData();
if (asiaList != null && asiaList.size() > 0) {
for (int i = 0; i < asiaList.size(); i++) {
imageHistory.setImageBitmap(loadBitmapFromAssets(getApplicationContext(),
asiaList.get(i).getImageResourceID()));
}
}
int numberPage = 7;
for (int i = 0; i < numberPage; i++) {
tabLayout.addTab(tabLayout.newTab().setText(pageTitle[i]));
}
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
ViewPagerCountryAdapter viewPagerAdapter = new ViewPagerCountryAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setOnTabSelectedListener(this);
}
private void retrieveData() {
WorldCountryDatabase worldCountryDatabase = new WorldCountryDatabase(getApplicationContext());
worldCountryDatabase.createDatabase();
worldCountryDatabase.openDataBase();
Log.d(ARG_PARAM1, "Database opened");
try {
Cursor cursor = worldCountryDatabase.QueryData("SELECT viewImage FROM country WHERE name = '" + content + "'");
Log.d("CURSOR", cursor.toString());
if (cursor.moveToFirst()) {
do {
AsiaCountry asia = new AsiaCountry();
asia.setImageResourceID(cursor.getString(0));
Log.d("image", cursor.getString(0));
asiaList.add(asia);
} while (cursor.moveToNext());
cursor.close();
}
} catch (SQLException e) {
e.printStackTrace();
Log.d("TAG", e.getMessage());
}
}
@Nullable
private Bitmap loadBitmapFromAssets(Context context, String path) {
InputStream stream = null;
try {
stream = context.getAssets().open(path);
return BitmapFactory.decodeStream(stream);
} catch (Exception ignored) {
} finally {
try {
if (stream != null) {
stream.close();
}
} catch (Exception ignored) {
}
}
return null;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(base));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
@Override
public void economiOnFragmentInteraction(Uri uri) {
}
@Override
public void tipsOnFragmentInteraction(Uri uri) {
}
@Override
public void otherOnFragmentInteraction(Uri uri) {
}
@Override
public void peopleOnFragmentInteraction(Uri uri) {
}
@Override
public void historyOnFragmentInteraction(Uri uri) {
}
@Override
public void geographyOnFragmentInteraction(Uri uri) {
}
@Override
public void summarizeOnFragmentInteraction(Uri uri) {
}
public class DetailTask extends AsyncTask<Void, Void, Boolean>{
@Override
protected Boolean doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
}
}
公共类详细信息中心扩展了AppCompatActivity实现
TabLayout.ontAbsSelectedListener,
EconomicFragment.EconomicOnFragmentInteractionListener,
SummaryFragment.SummaryOnFragmentInteractionListener,
HistoryFragment.HistoryOnFragmentInteractionListener,
GeographyFragment.GeographyOnFragmentInteractionListener,
TipsFragment.TipsOnFragmentInteractionListener,
DescriptionFragment.OtherOnFragmentInteractionListener,
PeopleFragment.PeopleOnFragmentInteractionListener{
公共静态字符串名称\u COUNTRY=“NAME”;
公共最终字符串pageTitle[]={“خلاه”,
"تاریخ",
"جغرافی",
"اقتصاد",
"مردم",
"غیره",