Android:如何在onClick方法中将对象从一个活动传递到另一个活动,并将其用于AsyncTask类

Android:如何在onClick方法中将对象从一个活动传递到另一个活动,并将其用于AsyncTask类,android,android-activity,onclick,android-asynctask,Android,Android Activity,Onclick,Android Asynctask,我有一个有点难以解释的问题。我正在为旅行计划构建一个android应用程序。我有一个主活动,其中包含映射项和一些其他按钮,还有一个AsyncTask类,其中完成了与服务器的通信,并在映射上显示了路径。我试图通过将服务器的响应保存在sqllite数据库中使其脱机工作 我有一个活动叫做MainActivity。在那里,我有一个菜单项的方法 public boolean onOptionsItemSelected(final MenuItem pItem) { switch (

我有一个有点难以解释的问题。我正在为旅行计划构建一个android应用程序。我有一个主活动,其中包含映射项和一些其他按钮,还有一个AsyncTask类,其中完成了与服务器的通信,并在映射上显示了路径。我试图通过将服务器的响应保存在sqllite数据库中使其脱机工作

我有一个活动叫做MainActivity。在那里,我有一个菜单项的方法

public boolean onOptionsItemSelected(final MenuItem pItem) {        
    switch (pItem.getItemId()) {
    case R.id.recent_trips:
            startActivity(new Intent(this, recentTripsActivity.class));
            break;
    default:
             break;
        }

        return false;
    }
}
下面是调用AsyncTask类的当前方法

btnPlanTrip.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
      tripReq = new TripRequest(MainActivity.this,activityHandler,db);
    tripReq.execute(request);
    }
     });
}
当我从菜单按钮单击最近的行程时,将打开recentTripsActivity。基本上,在这个类中,我从mysqllite数据库中检索一些数据,并通过适配器将其显示在listView中。在这里,我有一个方法view.setOnClickListener,在其中单击列表项时,我会获取一个特定的值(res=listItem.getofflineResult();)。我希望在主要活动中使用该值(有关更多详细信息,请参见下文)。 这是代码

public class recentTripsActivity extends Activity implements Serializable {
    private ImageButton stopSearch;
    private AutoCompleteTextView searchField;
    SQLiteDatabase db;
    OfflineTripRequest tripReq;
    String res;
    //db = openOrCreateDatabase("AndroidDatabase.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);


     private ListView listview;
     private ArrayList mListItem;
     ItemBO listItem;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.recent_trips); 

            //open database connection
            db = openOrCreateDatabase("AndroidDatabase.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
            int i=0;
            String [] str={"id","description","offlineResult"};
            listview = (ListView) findViewById(R.id.lview_trips);

            mListItem = new ArrayList<ItemBO>();

            Cursor cursor = db.query("tbl_offlinePathResult",str, null, null, null, null, null);

            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                i++;
                ItemBO listItem = new ItemBO(i,cursor.getString(1),cursor.getString(2));
                mListItem.add(listItem);
                cursor.moveToNext();
                if(i==10){
                    break;
                }
            }
            // Make sure to close the cursor
            cursor.close();
            i++;

            listview.setAdapter(new ListAdapter(recentTripsActivity.this, R.id.lview_trips,mListItem));
            db.close();
    }


//***ListAdapter***
 class ListAdapter extends ArrayAdapter { //--CloneChangeRequired
    private ArrayList mList; //--CloneChangeRequired
    private Context mContext;

    @SuppressWarnings("unchecked")
    public ListAdapter(Context context, int textViewResourceId,
            ArrayList list) { //--CloneChangeRequired
        super(context, textViewResourceId, list);
        this.mList = list;
        this.mContext = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        try {
            if (view == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = vi.inflate(R.layout.list_item_saved_paths, null); //--CloneChangeRequired(list_item)
            }
            final ItemBO listItem = (ItemBO) mList.get(position); //--CloneChangeRequired
            if (listItem != null) {
                // setting list_item views
                ((TextView) view.findViewById(R.id.tv_name))
                        .setText(listItem.getDescription());

                view.setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) { //--clickOnListItem
                         res=listItem.getofflineResult(); 

                    }
                });
            }
        } catch (Exception e) {
            Log.i(recentTripsActivity.ListAdapter.class.toString(), e.getMessage());
        }
        return view;
    }
 }
}
公共类recentTripsActivity扩展活动实现可序列化{
私人图像按钮停止搜索;
私有AutoCompleteTextView搜索字段;
sqlitedb数据库;
离线TripRequest tripReq;
字符串res;
//db=openOrCreateDatabase(“AndroidDatabase.db”,SQLiteDatabase.CREATE_,如果需要,则为null);
私有列表视图列表视图;
私人ArrayList mListItem;
项目列表项目;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.最近的行程);
//开放数据库连接
db=openOrCreateDatabase(“AndroidDatabase.db”,SQLiteDatabase.CREATE_,如果需要,则为null);
int i=0;
字符串[]str={“id”,“description”,“offlineResult”};
listview=(listview)findViewById(R.id.lview_);
mListItem=新的ArrayList();
Cursor Cursor=db.query(“tbl_offlinePathResult”,str,null,null,null,null);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
i++;
itembolistItem=newitembo(i,cursor.getString(1),cursor.getString(2));
mListItem.add(列表项);
cursor.moveToNext();
如果(i==10){
打破
}
}
//确保关闭光标
cursor.close();
i++;
setAdapter(新的ListAdapter(recentTripsActivity.this,R.id.lview_trips,mListItem));
db.close();
}
//***列表适配器***
类ListAdapter扩展ArrayAdapter{/--CloneChangeRequired
private ArrayList mList;/--clonechange必需
私有上下文;
@抑制警告(“未选中”)
公共ListAdapter(上下文上下文,int textViewResourceId,
ArrayList列表){/--CloneChangeRequired
super(上下文、textViewResourceId、列表);
this.mList=列表;
this.mContext=上下文;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
试一试{
如果(视图==null){
LayoutInflater vi=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
视图=vi.充气(R.layout.list_item_saved_paths,null);/--CloneChangeRequired(list_item)
}
final ItemBO listItem=(ItemBO)mList.get(position);/--CloneChangeRequired
如果(listItem!=null){
//设置列表项目视图
((TextView)view.findviewbyd(R.id.tv_name))
.setText(listItem.getDescription());
view.setOnClickListener(新的OnClickListener(){
单击(视图arg0){/--clickOnListItem时公共无效
res=listItem.getofflineResult();
}
});
}
}捕获(例外e){
Log.i(recentTripsActivity.ListAdapter.class.toString(),e.getMessage());
}
返回视图;
}
}
}
我想传递上面提到的数据(res=listItem.getofflineResult()到MainActivity。完成后,我想调用一个AsyncTask类并将该数据传递给该类。我如何通过单击listItem来完成这一切?正如我之前所说,映射是在MainActivity上,但单击将从不同的活动中发生。
我希望我说得足够清楚,如果你有任何问题,请问我

在android应用程序中传递数据时,我通常使用单例方法。如果你不熟悉,它基本上是一个静态类,总是返回相同的实例。这允许你创建多个共享相同数据的类“实例”

您可以通过多种方式传递res(字符串?),最简单的是抛出首选项:

SharedPreferences settings = context.getSharedPreferences(APPNAME, 0);
SharedPreferences.Editor editor = settings.edit();
    editor.putString("res", res);
    editor.commit();
然后在MainActivity中获得:

SharedPreferences settings = context.getSharedPreferences(APPNAME, 0);
res = settings.getString("res","");
您还可以保存在本地数据库中,或者像“tkcsam”所说的使用静态和抽象变量

public abstract Global{
 public static String res;
}
您可以参加任何活动,如:

Global.res = "A"

首先,您需要覆盖列表中的onListItemClick。然后,您需要将所需信息放入捆绑包并结束活动。此捆绑包将“返回”到该活动的onActivityReuslt方法中的调用活动(您需要覆盖该方法)。请参阅: