2013-03-26 254 views
0

當我嘗試掃描QR碼時,我的應用程序正在關閉。我以前沒有使用asynctask,它工作正常,我想我的asynctask工作方式有問題,任何建議都會受到歡迎。下面 是我的logcat使用asynctask時QR閱讀器崩潰

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

首先你正在使用已經在後臺運行的'doInBackground',但是你還需要使用一個'Thread'來啓動'zxing' Activity。對不起,這不起作用。建議:從doInBackground中刪除第二個線程。使用'MainActivity.this.startActivityForResult'來啓動活動 – 2013-03-26 12:49:16

+0

我刪除了doInBackground中的第二個線程,我應該在哪裏使用MainActivity.this.startActivityForResult? – niraj 2013-03-26 12:53:16

+0

我的意思是使用'MainActivity.this。startActivityForResult'而不是'startActivityForResult'來啓動doInBackground裏面的Activity – 2013-03-26 12:54:56

回答

1

你不需要任何後臺線程的。既不是異步任務也不是線程。線程是用於長時間運行的操作,可能會阻塞UI線程,就像使用數據庫或http請求運行查詢一樣。

在你的情況,你正在啓動對結果產生一個新活動,這樣即使你的日誌是給你 「這個應用程序可以做太多的工作在其主線程」,那麼它是一個更大的機會,你開始下一個活動是在主UI線程上做一些事情,而不是主要活動。 即使您確信應用異步任務,您可能是在錯誤的活動中執行此操作。這是因爲在啓動新的Intent之後,當前活動將進入onPause(),主UI線程現在將用於掃描活動。

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; 

這是我抓住了在第一次嘗試尋找實現它,看看它是否工作

+0

嘗試過,但它做了同樣的事情,強制關閉:/ – niraj 2013-03-26 12:42:00

0

2件事需要做

  1. 定義活動在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> 
    
  2. 您必須在您的應用程序斑馬線lib或您必須安裝 在設備

斑馬線條形碼的應用程序,因爲你需要還可以創建項目爲lib和隨後的lib在你的項目中包含lib

注意:最重要的永遠不會做任何在inBackground()方法中具有UI實現的進程。這隻適用於後臺進程而不適用於UI進程。

+0

當我沒有使用asynctask時,它工作正常,我已經在我的項目 – niraj 2013-03-26 12:43:11

+0

中添加了zxing lib,但爲什麼你開始一個活動asyntask進程它不能在進程 – Pratik 2013-03-26 12:48:45

+0

其實我得到「這個應用程序可能在其主線程上做了太多工作」,經調查,我發現使用asyntask可以解決這個問題,但實現它可能相當困難 – niraj 2013-03-26 13:04:14

0

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

嘗試這個