Java 在后台执行时发生异步任务错误

Java 在后台执行时发生异步任务错误,java,android,exception,jar,android-asynctask,Java,Android,Exception,Jar,Android Asynctask,我正在构建一个NFC安卓应用程序,其中它将读取NFC卡并显示卡号。当我运行应用程序并出现在屏幕上点击卡时,当我点击卡进度条等待出现,然后在doInbackground中运行时,它会给出aysnc任务的错误。这是我的HomeActivity类 package com.github.devnied.emvnfccard.activity; import java.io.IOException; import java.lang.ref.WeakReference; import java.util

我正在构建一个NFC安卓应用程序,其中它将读取NFC卡并显示卡号。当我运行应用程序并出现在屏幕上点击卡时,当我点击卡进度条等待出现,然后在doInbackground中运行时,它会给出aysnc任务的错误。这是我的HomeActivity类

 package com.github.devnied.emvnfccard.activity;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Collection;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.github.devnied.emvnfccard.R;
import com.github.devnied.emvnfccard.adapter.MenuDrawerAdapter;
import com.github.devnied.emvnfccard.fragment.AboutFragment;
import com.github.devnied.emvnfccard.fragment.ConfigurationFragment;
import com.github.devnied.emvnfccard.fragment.IRefreshable;
import com.github.devnied.emvnfccard.fragment.ViewPagerFragment;
import com.github.devnied.emvnfccard.model.EmvCard;
import com.github.devnied.emvnfccard.parser.EmvParser;
import com.github.devnied.emvnfccard.provider.Provider;
import com.github.devnied.emvnfccard.utils.AtrUtils;
import com.github.devnied.emvnfccard.utils.ConstantUtils;
import com.github.devnied.emvnfccard.utils.CroutonUtils;
import com.github.devnied.emvnfccard.utils.NFCUtils;
import com.github.devnied.emvnfccard.utils.SimpleAsyncTask;

import de.keyboardsurfer.android.widget.crouton.Crouton;
import fr.devnied.bitlib.BytesUtils;

/**
 * Main Activity
 * 
 * @author MILLAU Julien
 * 
 */
@SuppressLint("InlinedApi")
public class HomeActivity extends FragmentActivity implements OnItemClickListener, IContentActivity {

    /**
     * Nfc utils
     */
    private NFCUtils mNfcUtils;

    /**
     * Waiting Dialog
     */
    private ProgressDialog mDialog;

    /**
     * Alert dialog
     */
    private AlertDialog mAlertDialog;

    /**
     * Drawer layout
     */
    private DrawerLayout mDrawerLayout;
    /**
     * ListView drawer
     */
    private ListView mDrawerListView;
    /**
     * Action bar drawer toggle
     */
    private ActionBarDrawerToggle mActionBarDrawerToggle;

    /**
     * Menu adapter
     */
    private MenuDrawerAdapter mMenuAdapter;

    /**
     * IsoDep provider
     */
    private Provider mProvider = new Provider();

    /**
     * Emv card
     */
    private EmvCard mReadCard;

    /**
     * Reference for refreshable content
     */
    private WeakReference<IRefreshable> mRefreshableContent;

    /**
     * last selected Menu
     */
    private int mLastSelectedMenu = -1;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // init NfcUtils
        mNfcUtils = new NFCUtils(this);

        // get ListView defined in activity_main.xml
        mDrawerListView = (ListView) findViewById(R.id.left_drawer);

        // Set the adapter for the list view
        mMenuAdapter = new MenuDrawerAdapter(this);
        mDrawerListView.setAdapter(mMenuAdapter);
        mDrawerListView.setOnItemClickListener(this);

        // 2. App Icon
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        // 2.1 create ActionBarDrawerToggle
        mActionBarDrawerToggle = new ActionBarDrawerToggle(/* */
        this, /* host Activity */
        mDrawerLayout, /* DrawerLayout object */
        R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
        R.string.navigation_menu_open, /* "open drawer" description */
        R.string.navigation_menu_close /* "close drawer" description */
        );

        // 2.2 Set actionBarDrawerToggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
        getActionBar().setDisplayUseLogoEnabled(false);
        getActionBar().setDisplayShowHomeEnabled(false);

        // Display home screen
        backToHomeScreen();

        // Read card on launch
        if (getIntent().getAction() == NfcAdapter.ACTION_TECH_DISCOVERED) {
            onNewIntent(getIntent());
        }
    }

    /**
     * Method used to back to home screen
     */
    public void backToHomeScreen() {
        // Select first menu
        mDrawerListView.performItemClick(mDrawerListView, 0, mDrawerListView.getItemIdAtPosition(0));
        // Close Drawer
        mDrawerLayout.closeDrawer(mDrawerListView);
    }

    @Override
    protected void onResume() {
        mNfcUtils.enableDispatch();
        // Close
        if (mAlertDialog != null && mAlertDialog.isShowing()) {
            mAlertDialog.cancel();
        }
        // Check NFC enable
        if (!NFCUtils.isNfcEnable(getApplicationContext())) {
            backToHomeScreen();

            AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
            alertbox.setTitle(getString(R.string.msg_info));
            alertbox.setMessage(getString(R.string.msg_nfc_disable));
            alertbox.setPositiveButton(getString(R.string.msg_activate_nfc), new DialogInterface.OnClickListener() {

                @Override
                public void onClick(final DialogInterface dialog, final int which) {
                    Intent intent = null;
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        intent = new Intent(Settings.ACTION_NFC_SETTINGS);
                    } else {
                        intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
                    }
                    dialog.dismiss();
                    startActivity(intent);
                }
            });
            alertbox.setCancelable(false);
            mAlertDialog = alertbox.show();
        }
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mNfcUtils.disableDispatch();
    }

    @Override
    protected void onNewIntent(final Intent intent) {
        super.onNewIntent(intent);
        final Tag mTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (mTag != null) {

            new SimpleAsyncTask() {

                /**
                 * Tag comm
                 */
                private IsoDep mTagcomm;

                /**
                 * Emv Card
                 */
                private EmvCard mCard;

                /**
                 * Boolean to indicate exception
                 */
                private boolean mException;

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();

                    backToHomeScreen();
                    mProvider.getLog().setLength(0);
                    // Show dialog
                    if (mDialog == null) {
                        mDialog = ProgressDialog.show(HomeActivity.this, getString(R.string.card_reading),
                                getString(R.string.card_reading_desc), true, false);
                    } else {
                        mDialog.show();
                    }
                }

                @Override
                protected void doInBackground() {

                    mTagcomm = IsoDep.get(mTag);
                    if (mTagcomm == null) {
                        CroutonUtils.display(HomeActivity.this, getText(R.string.error_communication_nfc), false);
                        return;
                    }
                    mException = false;

                    try {
                        mReadCard = null;
                        // Open connection
                        mTagcomm.connect();
                        Collection<String> desc = extractAtsDescription(mTagcomm);

                        mProvider.setmTagCom(mTagcomm);

                        EmvParser parser = new EmvParser(mProvider, true);
                        mCard = parser.readEmvCard();
                        if (mCard != null) {
                            mCard.setAtrDescription(desc);
                        }

                    } catch (IOException e) {
                        mException = true;
                    } finally {
                        // close tagcomm
                        IOUtils.closeQuietly(mTagcomm);
                    }
                }

                @Override
                protected void onPostExecute(final Object result) {
                    // close dialog
                    if (mDialog != null) {
                        mDialog.cancel();
                    }

                    if (!mException) {
                        if (mCard != null && StringUtils.isNotBlank(mCard.getCardNumber())) {
                            CroutonUtils.display(HomeActivity.this, getText(R.string.card_read), true);
                            mReadCard = mCard;
                        } else {
                            CroutonUtils.display(HomeActivity.this, getText(R.string.error_card_unknown), false);
                        }
                    } else {
                        CroutonUtils.display(HomeActivity.this, getResources().getText(R.string.error_communication_nfc), false);
                    }

                    refreshContent();
                }

            }.execute();
        }

    }

    /**
     * Method used to get historical byte
     * 
     * @param pIso
     */
    public Collection<String> extractAtsDescription(final IsoDep pIso) {
        Collection<String> ret = null;
        if (pIso.isConnected()) {
            // Extract ATS from NFC-A
            byte[] atr = pIso.getHistoricalBytes();
            if (atr == null) {
                // Extract ATS from NFC-B
                atr = pIso.getHiLayerResponse();
                if (atr == null) {
                    return ret;
                }
            }
            ret = AtrUtils.getDescriptionFromAts(BytesUtils.bytesToString(atr));
        }
        return ret;
    }

    // @Override
    // public void onBackPressed() {
    // if (BuildConfig.DEBUG) {
    // StringBuffer buff = mProvider.getLog();
    // for (int i = 0; i < 6000; i++) {
    // buff.append("=============<br/>");
    // }
    // mReadCard = new EmvCard();
    // mReadCard.setCardNumber("4123456789012345");
    // mReadCard.setAid("A0 00 00 000310 10");
    // mReadCard.setLeftPinTry(3);
    // mReadCard.setAtrDescription(Arrays.asList("German Health Insurance Card",
    // "LogCard from concept2.com (a indoor rower manufacturer)", "I2C card"));
    // mReadCard.setApplicationLabel("CB");
    // mReadCard.setHolderName("test test");
    // mReadCard.setExpireDate(new Date());
    // mReadCard.setType(EmvCardScheme.VISA);
    // List<EmvTransactionRecord> records = new ArrayList<EmvTransactionRecord>();
    // // payment
    // EmvTransactionRecord payment = new EmvTransactionRecord();
    // payment.setAmount((float) 100.0);
    // payment.setCurrency(CurrencyEnum.EUR);
    // payment.setCyptogramData("12");
    // payment.setTerminalCountry(CountryCodeEnum.FR);
    // payment.setTransactionDate(new Date());
    // payment.setTransactionType(TransactionTypeEnum.REFUND);
    // records.add(payment);
    //
    // payment = new EmvTransactionRecord();
    // payment.setAmount((float) 12.0);
    // payment.setCurrency(CurrencyEnum.USD);
    // payment.setCyptogramData("40");
    // payment.setTerminalCountry(CountryCodeEnum.US);
    // payment.setTransactionDate(new Date());
    // payment.setTransactionType(TransactionTypeEnum.PURCHASE);
    // records.add(payment);
    //
    // payment = new EmvTransactionRecord();
    // payment.setAmount((float) 120.0);
    // payment.setCurrency(CurrencyEnum.USD);
    // payment.setCyptogramData("40");
    // payment.setTerminalCountry(CountryCodeEnum.US);
    // payment.setTransactionDate(new Date());
    // payment.setTransactionType(TransactionTypeEnum.PURCHASE);
    // records.add(payment);
    //
    // mReadCard.setListTransactions(records);
    // refreshContent();
    // CroutonUtils.display(HomeActivity.this, getText(R.string.card_read), true);
    // } else {
    // super.onBackPressed();
    // }
    // }

    @Override
    protected void onDestroy() {
        Crouton.cancelAllCroutons();
        super.onDestroy();
    }

    @Override
    protected void onPostCreate(final Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mActionBarDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(final Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mActionBarDrawerToggle.onConfigurationChanged(newConfig);
    }

    private void refreshContent() {
        if (mRefreshableContent != null && mRefreshableContent.get() != null) {
            mRefreshableContent.get().update();
        }
    }

    @Override
    public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
        if (mLastSelectedMenu != position) {
            Fragment fragment = null;
            switch (position) {
            case ConstantUtils.CARDS_DETAILS:
                fragment = new ViewPagerFragment();
                refreshContent();
                break;
            case ConstantUtils.CONFIGURATION:
                fragment = new ConfigurationFragment();
                break;
            case ConstantUtils.ABOUT:
                fragment = new AboutFragment();
                break;
            default:
                break;
            }
            if (fragment != null) {
                getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();
            }
            mLastSelectedMenu = position;
        }
        mDrawerLayout.closeDrawer(mDrawerListView);
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        if (mActionBarDrawerToggle.onOptionsItemSelected(item)) {
            Crouton.cancelAllCroutons();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public StringBuffer getLog() {
        return mProvider.getLog();
    }

    @Override
    public EmvCard getCard() {
        return mReadCard;
    }

    @Override
    public void setRefreshableContent(final IRefreshable pRefreshable) {
        mRefreshableContent = new WeakReference<IRefreshable>(pRefreshable);
    }

    /**
     * Method used to clear data
     */
    public void clear() {
        mReadCard = null;
        mProvider.getLog().setLength(0);
        IRefreshable content = mRefreshableContent.get();
        if (content != null) {
            content.update();
        }
    }
}
请帮忙…提前谢谢 当做 B软件

  • 您必须从下载jar文件。(忽略此步骤,因为根据您的注释,您已经有了jar文件)


  • 将Jar移动到项目的
    lib
    路径。(如果
    a.Jar
    在桌面上,而项目是
    abcapapplication
    ,则将Jar复制并粘贴到
    abcapapplication/lib
    文件夹中。如果文件夹不可用,则创建文件夹)

  • 在eclipse中右键单击Jar并选择构建路径-->添加到构建路径

  • 将jar添加到项目路径的另一种方法是:

  • 右键单击项目-->属性-->生成路径-->添加外部JAR
  • 选择您的jar文件
  • 下载jar文件

  • 将jar文件复制到“libs”文件夹

  • 右键单击jar文件>构建路径>添加到构建路径

  • 如果它仍然不工作,右键单击jar文件>构建路径>配置构建路径

    在“订购和导出”选项卡中,请确保已选中您的库


  • 所有这些都是真实的
    java.lang.NoClassDefFoundError:org.apache.commons.io.IOUtils
    那么解决方案是什么呢?请帮助。确保此jar文件在类路径上可用确保设置了类路径properly@ScaryWombat这个jar文件就在那里,伙计。把jar移到你项目的lib路径?如何做到这一点?请帮助。它应该是“libs”文件夹,就像我上面回答的第2步:2。将jar文件复制到“libs”folder@bsoftsolutions:如果你的a.jar在桌面上,而你的项目是abcapapplication,那么请将该jar复制并粘贴到abcapapplication/lib文件夹中。如果文件夹不可用,请创建该文件夹。@bsoftsolutions:请用图片参考我编辑的答案。非常感谢@NishanthiGrashia..Thank Aloot
    public abstract class SimpleAsyncTask extends AsyncTask<Void, Void, Object> {
    
        @Override
        protected Object doInBackground(final Void... params) {
    
            Object result = null;
    
            try {
                doInBackground();
            } catch (Exception e) {
                result = e;
                Log.e(SimpleAsyncTask.class.getName(), e.getMessage(), e);
            }
    
            return result;
        }
    
        protected abstract void doInBackground();
    
    }
    
      08-21 05:01:21.581: E/AndroidRuntime(12469): FATAL EXCEPTION: AsyncTask #1
        08-21 05:01:21.581: E/AndroidRuntime(12469): java.lang.RuntimeException: An error occured while executing doInBackground()
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.lang.Thread.run(Thread.java:856)
        08-21 05:01:21.581: E/AndroidRuntime(12469): Caused by: java.lang.NoClassDefFoundError: org.apache.commons.io.IOUtils
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at com.github.devnied.emvnfccard.activity.HomeActivity$2.doInBackground(HomeActivity.java:274)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at com.github.devnied.emvnfccard.utils.SimpleAsyncTask.doInBackground(SimpleAsyncTask.java:20)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at com.github.devnied.emvnfccard.utils.SimpleAsyncTask.doInBackground(SimpleAsyncTask.java:1)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
        08-21 05:01:21.581: E/AndroidRuntime(12469):    ... 4 more