NDEF_DISCOVERED 时将字符串传递给 ASyncTask

Pass a string to ASyncTask when NDEF_DISCOVERED

我在 NFC 标签中工作。我的任务是当一个NFC被扫描时,我必须读取NFC信息并将其发送到ASyncTask。在 ASyncTask 中,我将使用 HttpClient 将该信息发送到服务器。我成功读取了NFC信息。我搜索并找到了我的解决方案。我只是使用了最简单的解决方案,如下所示。该代码运行良好。 ASyncTaskACTION_NDEF_DISCOVERED 中初始化,因此,当扫描标签时,将创建 ASyncTask 并将请求调用到服务器。我的问题是 ASyncTask 创建了很多次(每当扫描标签时)。我们有什么方法可以在 onCreate 中只创建一次 ASyncTask,并且当标签被扫描时,我们会向 ASyncTask 传递一个字符串?

    /////Read NFC Information///////////////
    @Override
    protected void onNewIntent(Intent intent) {
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
            //Read NFC tag succesfull
            String NFC_information=100;
            new AsyncCallWS().execute("101");            
        }
    }
    private class AsyncCallWS extends AsyncTask<String, Void, Void> {
        @Override
        protected Void doInBackground(String... params) {
            String url="server_link"+params[0];
            try {               
                String content_feedback=getStringContent(url);

            } catch (Exception e) {e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            Log.i(TAG, "onPostExecute");
        }
        @Override
        protected void onPreExecute() {
            Log.i(TAG, "onPreExecute");
        }
        @Override
        protected void onProgressUpdate(Void... values) {
            Log.i(TAG, "onProgressUpdate");
        }
    }
    public static String getStringContent(String uri) throws Exception {
    {
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(uri));
            HttpResponse response = client.execute(request);
            InputStream ips  = response.getEntity().getContent();
            BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));
            StringBuilder sb = new StringBuilder();
            String s;
            while(true )
            {
                s = buf.readLine();
                if(s==null || s.length()==0)
                    break;
                sb.append(s);

            }
            buf.close();
            ips.close();
            return sb.toString();

            } 
        finally { }
    }

您可以像下面这样操作:

public void onResume() {
    super.onResume();
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
                //consider single message is there hence loop will iterate only once
                new MyAsync().execute(msgs[i]);
            }
        }
    }
    //process the msgs array
}

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain" />
</intent-filter>

因为在调用 onNewIntent 之后,onResume 被调用了。