Android 使用asynctask时QR读取器崩溃

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

当我尝试扫描二维码时,我的应用程序正在关闭。我以前没有使用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 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
的可运行线程(本身是一个线程)

这就是我第一眼看到的,试着实现它,看看它是否有效

需要做的两件事

  • 在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条码在设备中的应用

  • 作为库,您还需要将项目创建为库,然后在项目中包含库

    注意:最重要的是,永远不要做任何在inBackground()方法中实现UI的过程。这只适用于后台进程,不适用于UI进程。

    在MainFest中

     <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>