com.android.inputmethod.latin 中的 ANR 原因:输入调度超时
Posted
技术标签:
【中文标题】com.android.inputmethod.latin 中的 ANR 原因:输入调度超时【英文标题】:ANR in com.android.inputmethod.latin Reason: Input dispatching timed out 【发布时间】:2019-03-19 19:18:00 【问题描述】:我在本地数据库中有近 6,000 条数据。在一个片段上,我从该记录中得到一个字段,即“EAN 代码”,几乎是 6,000。现在我将这些数据设置在一个 ArrayList 中。之后,我在 AutoTextCompleteView 的适配器中设置了 ArrayList。当我搜索 AutoTextCompleteView 时,它会挂起我的页面。我的片段没有响应。我很困惑是由于大量数据还是什么。请帮忙。
代码:
if (getCodeType.equals("art"))
modelProductCodeList = databaseHelper.getProductsArticleCode();
for (int k = 0; k < modelProductCodeList.size(); k++)
productCodeList.add(modelProductCodeList.get(k).getArticle_code());
actSearchCode.setAdapter(null);
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, productCodeList);
actSearchCode.setAdapter(adapter);
rgGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
if (i == R.id.rdbArticleCode)
actSearchCode.setText("");
getCodeType = "art";
modelProductCodeList = databaseHelper.getProductsArticleCode();
databaseHelper.close();
productCodeList.clear();
for (int k = 0; k < modelProductCodeList.size(); k++)
productCodeList.add(modelProductCodeList.get(k).getArticle_code());
actSearchCode.setAdapter(null);
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, productCodeList);
actSearchCode.setAdapter(adapter);
else if (i == R.id.rdbEANCode)
actSearchCode.setText("871128");
getCodeType = "ean";
modelProductCodeList = databaseHelper.getProductsEANCode();
databaseHelper.close();
productCodeList.clear();
for (int k = 0; k < modelProductCodeList.size(); k++)
productCodeList.add(modelProductCodeList.get(k).getEan_code());
actSearchCode.setAdapter(null);
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, productCodeList);
actSearchCode.setAdapter(adapter);
);
actSearchCode.setThreshold(3);
actSearchCode.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(actSearchCode.getApplicationWindowToken(), 0);
Fragment fragment = new ProductDetailFragment();
FragmentManager fragmentManager = getFragmentManager(); // this is basically context of the class
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("product_art", (String) adapterView.getItemAtPosition(i));
bundle.putString("source_type", getCodeType);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
);
片段的完整代码
public class SearchProductFragment extends Fragment implements View.OnClickListener
ImageButton imgBarcodeScan;
AutoCompleteTextView actSearchCode;
RadioButton rdbArticleCode, rdbEANCode;
RadioGroup rgGroup;
ImageView imgClose,imgSourceClose;
String getCodeType = "art";
DatabaseHelper databaseHelper;
ArrayList<ModelProductDetail> modelProductArticleCodeList;
ArrayList<ModelProductDetail> modelProductCodeList;
ArrayList<ModelUnrecognisedCode> modelUnrecognisedCodeArrayList;
ArrayList<ModelProductDetail> singleProductDetailList;
ArrayList<ModelUnrecognisedCode> singleUnrecognisedCheck;
List<String> productCodeList;
private ZBarScannerView scannerView;
private LayoutInflater mInflater;
private ViewGroup mContainer;
ViewGroup placeholder;
private static final int REQUEST_CAMERA = 1;
String article_code;
Boolean unrecognised_alert;
String unrecognised_code = "";
ArrayAdapter<String> adapter;
int codeValue;
KeyEvent keyevent;
// scan code
ScanDevice sm;
private final static String SCAN_ACTION = "scan.rcv.message";
private String barcodeStr = "";
private BroadcastReceiver mScanReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
// TODO Auto-generated method stub
byte[] barocode = intent.getByteArrayExtra("barocode");
int barocodelen = intent.getIntExtra("length", 0);
byte temp = intent.getByteExtra("barcodeType", (byte) 0);
android.util.Log.i("debug", "----codetype--" + temp);
barcodeStr = new String(barocode, 0, barocodelen);
Log.e("TAG", " barcodeStr" + barcodeStr);
// showScanResult.setText(barcodeStr);
sm.stopScan();
codeValue = 1;
if(! (barcodeStr.equals("")))
singleProductDetailList = databaseHelper.getProductByEANCode(barcodeStr);
if(singleProductDetailList.size() != 0)
Fragment fragment = new ProductDetailFragment();
FragmentManager fragmentManager = getFragmentManager(); // this is basically context of the class
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("product_art", barcodeStr);
bundle.putString("source_type", "ean");
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
else
singleUnrecognisedCheck = new ArrayList<>();
singleUnrecognisedCheck = databaseHelper.getUnrecognisedByCode(barcodeStr);
Vibrator vibrator = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
MediaPlayer mp = MediaPlayer.create(context, R.raw.beep);
mp.start();
if(singleUnrecognisedCheck.size() == 0)
getDialog();
else
Toast.makeText(getActivity(),R.string.unrecognised_code_has_been_added, Toast.LENGTH_SHORT).show();
;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View v = inflater.inflate(R.layout.fragment_search_product, container, false);
mInflater = inflater;
mContainer = container;
getIntializedID(v);
placeholder = (ViewGroup) v;
return placeholder;
private void getIntializedID(View view)
//scan device code
sm = new ScanDevice();
//
imgBarcodeScan = (ImageButton) view.findViewById(R.id.imgBarcodeScan);
rgGroup = (RadioGroup) view.findViewById(R.id.rgGroup);
actSearchCode = (AutoCompleteTextView) view.findViewById(R.id.actSearchCode);
imgClose = (ImageView) view.findViewById(R.id.imgClose);
imgSourceClose = (ImageView) view.findViewById(R.id.imgSourceClose);
databaseHelper = new DatabaseHelper(getActivity());
modelProductCodeList = new ArrayList<>();
productCodeList = new ArrayList<>();
singleProductDetailList = new ArrayList<>();
imgBarcodeScan.setOnClickListener(this);
imgClose.setOnClickListener(this);
// new chnage in code
actSearchCode.setText("");
actSearchCode.setAdapter(null);
actSearchCode.addTextChangedListener(new TextWatcher()
@Override
public void afterTextChanged(Editable s)
//do nothing
if(actSearchCode.getText().length() == 0)
if(getCodeType.equals("ean"))
actSearchCode.setText("871128");
else
actSearchCode.setText("");
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
//do nothing
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
if(s.length() != 0)
imgClose.setVisibility(View.VISIBLE);
imgSourceClose.setVisibility(View.GONE);
else
imgClose.setVisibility(View.GONE);
imgSourceClose.setVisibility(View.VISIBLE);
);
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, productCodeList);
actSearchCode.setAdapter(adapter);
// sample code barcode
public void changeFragments(Fragment fragment)
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame, fragment);
transaction.addToBackStack(null);
transaction.commit();
@Override
public void onClick(View view)
if (view.getId() == R.id.imgBarcodeScan)
//MediaPlayer mp = MediaPlayer.create(getActivity(), R.raw.beep);
// mp.start();
//scanCode(view);
// onKeyDown(301, keyevent);
Intent in = new Intent(getActivity(), ScanActivity.class);
startActivity(in);
else if(view.getId() == R.id.imgClose)
if(getCodeType.equals("ean"))
actSearchCode.setText("871128");
else
actSearchCode.setText("");
@Override
public void startActivityForResult(Intent intent, int requestCode)
super.startActivityForResult(intent, requestCode);
private void getDialog()
final Dialog d = new Dialog(getActivity());
d.setContentView(R.layout.dialog_unrecognised_code);
d.setCanceledOnTouchOutside(false);
d.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
final EditText etCode = (EditText) d.findViewById(R.id.etCode);
final EditText etrecognisedComment = (EditText) d.findViewById(R.id.etrecognisedComment);
ImageView imgClose = (ImageView) d.findViewById(R.id.imgClose);
ImageButton ibSubmit = (ImageButton) d.findViewById(R.id.ibSubmit);
if(codeValue == 1)
etCode.setText(barcodeStr);
else if(codeValue == 2)
etCode.setText(unrecognised_code);
imgClose.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
KEY_UNRECOGNISED_CODE = "";
d.dismiss();
);
ibSubmit.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
SessionManager session = new SessionManager(getContext().getApplicationContext());
HashMap<String, String> user = session.getSelectedShopDetail();
ModelUnrecognisedCode modelUnrecognisedCode = new ModelUnrecognisedCode();
modelUnrecognisedCode.setUnrecognised_code(etCode.getText().toString());
modelUnrecognisedCode.setUnrecognised_comment(etrecognisedComment.getText().toString());
modelUnrecognisedCode.setShop_id(user.get("shop_id"));
modelUnrecognisedCode.setShop_name_fr(user.get("shop_name_fr"));
modelUnrecognisedCode.setShop_name_nl(user.get("shop_name_nl"));
databaseHelper.addUnrecognisedCode(modelUnrecognisedCode);
// changeFragments(new SearchProductFragment());
modelUnrecognisedCodeArrayList = new ArrayList<>();
modelUnrecognisedCodeArrayList = databaseHelper.getUnrecognisedCode();
Toast.makeText(getActivity(), R.string.unrecognised_code_added_in_cart,Toast.LENGTH_SHORT).show();
KEY_UNRECOGNISED_CODE = "";
d.dismiss();
);
d.show();
public void onKeyDown(int keyCode, KeyEvent event)
int charCode = event.getKeyCode();
System.out.println("charCode = " + keyCode +" "+event);
//sm.openScan();
if (charCode == 302 || charCode == 301 || charCode == 303)
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(actSearchCode.getApplicationWindowToken(), 0);
System.out.println("openScannerL = " + sm.getOutScanMode());
sm.openScan();
else if (charCode == 82)
else
sm.closeScan();
@Override
public void onPause()
// TODO Auto-generated method stub
super.onPause();
if (sm != null)
sm.stopScan();
getActivity().unregisterReceiver(mScanReceiver);
@Override
public void onResume()
// TODO Auto-generated method stub
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(SCAN_ACTION);
getActivity().registerReceiver(mScanReceiver, filter);
// article code start
modelProductCodeList.clear();
productCodeList.clear();
if (getCodeType.equals("art"))
modelProductCodeList.clear();
productCodeList.clear();
modelProductCodeList = databaseHelper.getProductsArticleCode();
for (int k = 0; k < modelProductCodeList.size(); k++)
productCodeList.add(modelProductCodeList.get(k).getArticle_code());
rgGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
if (i == R.id.rdbArticleCode)
actSearchCode.setText("");
getCodeType = "art";
modelProductCodeList.clear();
productCodeList.clear();
modelProductCodeList = databaseHelper.getProductsArticleCode();
databaseHelper.close();
for (int k = 0; k < modelProductCodeList.size(); k++)
productCodeList.add(modelProductCodeList.get(k).getArticle_code());
adapter.notifyDataSetChanged();
else if (i == R.id.rdbEANCode)
actSearchCode.setText("871128");
getCodeType = "ean";
modelProductCodeList.clear();
productCodeList.clear();
modelProductCodeList = databaseHelper.getProductsEANCode();
databaseHelper.close();
for (int k = 0; k < modelProductCodeList.size(); k++)
productCodeList.add(modelProductCodeList.get(k).getEan_code());
adapter.notifyDataSetChanged();
);
actSearchCode.setThreshold(3);
actSearchCode.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(actSearchCode.getApplicationWindowToken(), 0);
Fragment fragment = new ProductDetailFragment();
FragmentManager fragmentManager = getFragmentManager(); // this is basically context of the class
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("product_art", (String) adapterView.getItemAtPosition(i));
bundle.putString("source_type", getCodeType);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
);
//end
if(!(KEY_UNRECOGNISED_CODE.equals("")))
if(!(KEY_SOURCE_CODE.equals("")))
Fragment fragment = new ProductDetailFragment();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); // this is basically context of the class
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("product_art",KEY_UNRECOGNISED_CODE);
bundle.putString("source_type", KEY_SOURCE_CODE);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
KEY_SOURCE_CODE = "";
KEY_UNRECOGNISED_CODE = "";
else
unrecognised_code = KEY_UNRECOGNISED_CODE;
codeValue = 2;
getDialog();
if (getArguments() != null)
unrecognised_alert = getArguments().getBoolean("unrecognised_alert");
@Override
public void onDestroyView()
super.onDestroyView();
【问题讨论】:
【参考方案1】:你应该在初始化所有变量后在 onCreate 中添加这些
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, productCodeList);
actSearchCode.setAdapter(adapter);
而且您不需要每次都设置一个新的适配器,您只需设置一次适配器,然后使用 productCodeList.clear() 并添加所有对象然后调用 adapter.notifyDatasetChanged()
【讨论】:
请把片段的全部代码贴出来,这会有所帮助 已添加请查看【参考方案2】:最好使用不同的ArrayList而不是单个ArrayList
HashMap<String,ArrayList> mapSearchList= new LinkedHashMap<>();
如果第一个字符从您开始设置为适配器,则在 ontextchange 侦听器中
setadapter(context,mapSearchList.get("a")) // etc
并设置阈值
【讨论】:
以上是关于com.android.inputmethod.latin 中的 ANR 原因:输入调度超时的主要内容,如果未能解决你的问题,请参考以下文章