Android 使用asynctask时QR读取器崩溃
当我尝试扫描二维码时,我的应用程序正在关闭。我以前没有使用asynctask,它工作正常,我想我对asynctask的工作方式有问题,欢迎提供任何建议。 下面是我的日志Android 使用asynctask时QR读取器崩溃,android,android-asynctask,zxing,Android,Android Asynctask,Zxing,当我尝试扫描二维码时,我的应用程序正在关闭。我以前没有使用asynctask,它工作正常,我想我对asynctask的工作方式有问题,欢迎提供任何建议。 下面是我的日志 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 Act
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;
}
}
}
公共类MainActivity扩展活动{
按钮btnScan;
文本视图结果1;
ImageView imgScan;
初始化任务扫描;
//@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//btnScan=(按钮)findViewById(R.id.button1);
imgScan=(ImageView)findViewById(R.id.imageButton1);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
scan=newinittask();
scan.execute();
}
});
}
ActivityResult上的公共void(int请求代码、int结果代码、意图){
if(requestCode==0){
if(resultCode==RESULT\u OK){
结果1=(TextView)findViewById(R.id.textView1);
字符串值=intent.getStringExtra(“扫描结果”);
//字符串格式=intent.getStringExtra(“扫描结果格式”);
结果1.setText(值);
Toast.makeText(MainActivity.this,
“扫描结果:”+值,Toast.LENGTH\u LONG)
.show();
}else if(resultCode==RESULT\u取消){
Toast.makeText(MainActivity.this,“您取消了扫描”,Toast.LENGTH_LONG.show();
}
}
}
私有类InitTask扩展了异步任务{
受保护的空位背景(空位…未使用){
新线程(newrunnable()){
@凌驾
公开募捐{
意图=新意图(
“com.google.zxing.client.android.SCAN”);
setPackage(“com.google.zxing.client.android”);
意向。额外(“扫描模式”、“二维码模式”);
startActivityForResult(意向,0);
}
}).start();
返回null;
}
}
}
请帮忙,你知道是什么引起的吗?
谢谢:)
删除doInBackground
的可运行线程(本身是一个线程)
这就是我第一眼看到的,试着实现它,看看它是否有效需要做的两件事
<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>
<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>
试试这个你根本不需要任何背景线程。既不是异步任务也不是线程。线程用于可能阻塞UI线程的长时间运行操作,如使用数据库或http请求运行查询 在您的情况下,您正在为结果启动一个新的活动,所以即使您的日志给您 “此应用程序可能在其主线程上做了太多的工作”,那么您启动的下一个活动更有可能在主UI线程上执行,而不是在主活动上执行。
即使您确信应用了异步任务,您也可能是在错误的活动中执行的。这是因为在启动新的Intent后,当前活动将进入onPause(),主UI线程现在将用于扫描活动。当我没有使用asynctask时,它工作正常,我已经在我的项目中添加了zxing库,但是为什么你要在asyntask进程中启动一个活动?它不能在进程中保持它实际上我得到了“这个应用程序可能在它的主线程上做了太多的工作”,经过调查,我发现使用asyntask可以解决这个问题,但是实现它可能非常困难,就像它是什么样子?因此,他们使用的是进程句柄,所以您需要在该部分进行调试,并将这种类型的句柄放在那里。我想你不知道AsyncTask类的概念。您正在呼叫意图,以便在后台阅读QR。那么它是如何工作的。把它从那里移开,它就可以正常工作了。请参考以下链接了解异步任务:希望现在您可以得到答案并解决您的问题。如果是,请接受我的答案并投票。首先,您使用的是已在后台运行的
doInBackground
,但您还使用了一个线程来启动zxing
活动。对不起,这不起作用。建议:从doInBackground上拆下第二根螺纹。使用MainActivity.this.startActivityForResult
启动活动我删除了doInBackground中的第二个线程,我应该在哪里使用MainActivity.this.startActivityForResult?我的意思是使用MainActivity.this.startActivityForResult
来启动doInBackground中的活动
<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>
<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>