当我尝试扫描QR码时,我的应用程序正在关闭。我以前没有使用过asynctask它工作正常,我想我对asynctask的工作方式有问题,任何建议都会受到欢迎。 下面是我的logcat
03-26 12:19:16.797: E/AndroidRuntime(1104): FATAL EXCEPTION: Thread-101
03-26 12:19:16.797: E/AndroidRuntime(1104): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.google.zxing.client.android.SCAN pkg=com.google.zxing.client.android (has extras) }
03-26 12:19:16.797: E/AndroidRuntime(1104): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622)
03-26 12:19:16.797: E/AndroidRuntime(1104): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
03-26 12:19:16.797: E/AndroidRuntime(1104): at android.app.Activity.startActivityForResult(Activity.java:3370)
03-26 12:19:16.797: E/AndroidRuntime(1104): at android.app.Activity.startActivityForResult(Activity.java:3331)
03-26 12:19:16.797: E/AndroidRuntime(1104): at com.example.restaurantapp.MainActivity$InitTask$1.run(MainActivity.java:68)
03-26 12:19:16.797: E/AndroidRuntime(1104): at java.lang.Thread.run(Thread.java:856)
这是我的主要活动
public class MainActivity extends Activity {
Button btnScan;
TextView result1;
ImageView imgScan;
InitTask scan;
//@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//btnScan=(Button)findViewById(R.id.button1);
imgScan=(ImageView)findViewById(R.id.imageButton1);
imgScan.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
scan=new InitTask();
scan.execute();
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
result1=(TextView)findViewById(R.id.textView1);
String values = intent.getStringExtra("SCAN_RESULT");
//String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
result1.setText(values);
Toast.makeText(MainActivity.this,
"Scan Result:" + values, Toast.LENGTH_LONG)
.show();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "you cancelled scanning", Toast.LENGTH_LONG).show();
}
}
}
private class InitTask extends AsyncTask<Void,Void,Void>{
protected Void doInBackground(Void...unused){
new Thread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(
"com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
}
}).start();
return null;
}
}
}
请帮助,知道是什么导致这个? 谢谢你:))
答案 0 :(得分:1)
您根本不需要任何后台线程。既不是异步任务也不是线程。线程适用于可能阻止UI线程的长时间运行操作,比如使用数据库或http请求运行查询。
在您的情况下,您正在启动结果的新活动,即使您的日志正在提供给您 “这个应用程序可能在其主线程上做了太多工作”然后你开始的下一个活动更有可能在主UI线程上做一些事情,而不是你的主要活动。 即使您确信应用Async Task,您可能也会在错误的活动中执行此操作。这是因为在启动新的Intent之后,当前活动将进入onPause(),主UI线程现在将用于扫描活动。 / p>
答案 1 :(得分:0)
protected Void doInBackground(Void...unused){
new Thread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(
"com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
}
}).start();
return null;
删除doInBackground
的可运行线程(本身就是一个线程)
protected Void doInBackground(Void...unused){
Intent intent = new Intent(
"com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
return null;
这是我第一次看到的尝试实现它并查看它是否有效
答案 2 :(得分:0)
需要做两件事
在AndroidManifest.xml文件中定义活动
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="com.google.zxing.client.android.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
您必须在应用程序中包含zxing lib,否则必须安装 设备中的zxing条形码应用
作为lib,您还需要创建项目作为lib,然后在项目中包含lib
注意:最重要的是永远不会在inBackground()方法中执行任何具有UI实现的进程。这仅适用于后台流程而非UI流程。
答案 3 :(得分:0)
在ManiFest中
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
>
<intent-filter>
<action android:name="com.google.zxing.client.android.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
试试这个