NDEF_DISCOVERED 时将字符串传递给 ASyncTask
Pass a string to ASyncTask when NDEF_DISCOVERED
我在 NFC 标签中工作。我的任务是当一个NFC被扫描时,我必须读取NFC信息并将其发送到ASyncTask
。在 ASyncTask
中,我将使用 HttpClient
将该信息发送到服务器。我成功读取了NFC信息。我搜索并找到了我的解决方案。我只是使用了最简单的解决方案,如下所示。该代码运行良好。 ASyncTask
在 ACTION_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
被调用了。
我在 NFC 标签中工作。我的任务是当一个NFC被扫描时,我必须读取NFC信息并将其发送到ASyncTask
。在 ASyncTask
中,我将使用 HttpClient
将该信息发送到服务器。我成功读取了NFC信息。我搜索并找到了我的解决方案。我只是使用了最简单的解决方案,如下所示。该代码运行良好。 ASyncTask
在 ACTION_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
被调用了。