我有一个应用程序,我需要将String从一个活动发送到另一个活动,并在AsyncTask部分活动中使用此String。我成功发送了String并在第二个活动的onCreate部分接收它,但在asyncTask中,此String必须是feed url的一部分,始终接收null值。 GcmIntentServices.java活动将String发送到AndroidRSSReader活动,字符串msg1。
GcmIntentServices.java:
package com.andrija.bladimircodewp;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.os.SystemClock;
import android.provider.Settings;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
public class GcmIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1;
private static final String TAG = "GcmIntentService";
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
Context context;
public static final int notifyID = 9001;
String msg1;
String msg2;
public GcmIntentService() {
super("GcmIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
String msg1 = intent.getStringExtra("cat_name");
String msg2 = intent.getStringExtra("message");
// String msg = intent.getStringExtra("message");
// String msg = msg1 + ":" + msg2;
// The getMessageType() intent parameter must be the intent you received
// in your BroadcastReceiver.
String messageType = gcm.getMessageType(intent);
if (!extras.isEmpty()) { // has effect of unparcelling Bundle
/*
* Filter messages based on message type. Since it is likely that GCM
* will be extended in the future with new message types, just ignore
* any message types you're not interested in, or that you don't
* recognize.
*/
if (GoogleCloudMessaging.
MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
sendNotification("Send error: " + extras.toString());
} else if (GoogleCloudMessaging.
MESSAGE_TYPE_DELETED.equals(messageType)) {
sendNotification("Deleted messages on server: " +
extras.toString());
// If it's a regular GCM message, do some work.
} else if (GoogleCloudMessaging.
MESSAGE_TYPE_MESSAGE.equals(messageType)) {
// This loop represents the service doing some work.
for (int i=0; i<5; i++) {
Log.i(TAG, "Working... " + (i+1)
+ "/5 @ " + SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
// Post notification of received message.
// sendNotification(extras.getString("Notice"));
sendNotification(msg1);
Log.i(TAG, "Received: " + extras.toString());
}
}
// Release the wake lock provided by the WakefulBroadcastReceiver.
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
private void sendNotification(String msg1) {
/* Intent resultIntent = new Intent(this, AndroidRssReader.class);
resultIntent.putExtra("message", msg);
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0,
resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); */
Intent resultIntent = new Intent(this, AndroidRssReader.class);
Bundle b = new Bundle();
// b.putString("message", msg);
b.putString("cat_name", msg1);
// resultIntent.putExtra("cat_name", msg1);
resultIntent.putExtras(b);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent resultPendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mNotifyBuilder;
NotificationManager mNotificationManager;
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyBuilder = new NotificationCompat.Builder(this)
// .setContentTitle("Alert")
// .setContentText("You've received new message.")
.setContentTitle("")
.setContentText(msg1)
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg1))
.setSmallIcon(R.drawable.gcm_cloud);
// Set pending intent
mNotifyBuilder.setContentIntent(resultPendingIntent);
// Set Vibrate, Sound and Light
int defaults = 0;
defaults = defaults | Notification.DEFAULT_LIGHTS;
defaults = defaults | Notification.DEFAULT_VIBRATE;
defaults = defaults | Notification.DEFAULT_SOUND;
mNotifyBuilder.setDefaults(defaults);
// Set the content for Notification
// mNotifyBuilder.setContentText("New message from Server");
// Set autocancel
mNotifyBuilder.setAutoCancel(true);
// Post a notification
mNotificationManager.notify(notifyID, mNotifyBuilder.build());
}
}
从另一个接收String的活动,AndroidRSS Reader.java:
package com.andrija.bladimircodewp;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import android.app.ProgressDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class AndroidRssReader extends ListActivity {
private RSSFeed myRssFeed = null;
// TextView mojtext = null;
// public String msg1 = "Katarina";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainrss);
// mojtext = (TextView)findViewById(R.id.moj_text);
Bundle extras = getIntent().getExtras();
// if(extras != null){
// String msg = extras.getString("message");
String msg1 = extras.getString("cat_name");
// mojtext.setText("EVO TITLA : " + msg);
// Toast.makeText(AndroidRssReader.this, msg1, Toast.LENGTH_LONG).show();
// new MyTask().execute();
MyTask task = new MyTask();
task.msg1 = extras.getString("cat_name");
task.execute();
// }
}
private class MyTask extends AsyncTask<Void, Void, Void>{
public String msg1;
public MyTask (String msg1) {
this.msg1 = msg1;
}
@Override
protected Void doInBackground(Void... arg0) {
try {
// URL rssUrl = new URL("http://160.99.61.22/pushapp/category/Katarina/feed/");
URL rssUrl = new URL("http://160.99.61.22/pushapp/category/" + msg1 + "/feed/");
SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
XMLReader myXMLReader = mySAXParser.getXMLReader();
RSSHandler myRSSHandler = new RSSHandler();
myXMLReader.setContentHandler(myRSSHandler);
InputSource myInputSource = new InputSource(rssUrl.openStream());
myXMLReader.parse(myInputSource);
myRssFeed = myRSSHandler.getFeed();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (myRssFeed!=null)
{
TextView feedTitle = (TextView)findViewById(R.id.feedtitle);
TextView feedSadrzajPosta = (TextView)findViewById(R.id.feedsadrzaj_posta);
TextView feedPubdate = (TextView)findViewById(R.id.feedpubdate);
TextView feedLink = (TextView)findViewById(R.id.feedlink);
feedTitle.setText(myRssFeed.getTitle());
feedSadrzajPosta.setText(myRssFeed.getSadrzajPosta());
feedPubdate.setText(myRssFeed.getPubdate());
feedLink.setText(myRssFeed.getLink());
ArrayAdapter<RSSItem> adapter =
new ArrayAdapter<RSSItem>(getApplicationContext(),
R.layout.list_black_text,R.id.list_content,myRssFeed.getList());
setListAdapter(adapter);
Toast.makeText(getApplicationContext(), "GGG: " + msg1, Toast.LENGTH_SHORT).show();
}else{
TextView textEmpty = (TextView)findViewById(android.R.id.empty);
textEmpty.setText("No Feed Found!");
}
super.onPostExecute(result);
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
Intent intent = new Intent(this,ShowDetails.class);
Bundle bundle = new Bundle();
bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle());
bundle.putString("keySadrzajPosta", myRssFeed.getItem(position).getSadrzaj_posta());
bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate());
intent.putExtras(bundle);
startActivity(intent);
}
}
为什么总是在doinbackground部分的Asynctask字符串msg1为空?
答案 0 :(得分:0)
Pass the param into the async task instead, like below:
MyTask task = new MyTask();
t.doInBackground("hello");
private class MyTask extends AsyncTask<String, Void, Void>
{
@Override
protected Void doInBackground(String... params)
{
String msg1 = params[0];
return null;
}
}