使用 AsyncTask 中的 onPostExecute 方法列表项单击事件调用 Android 中的另一个活动

Posted

技术标签:

【中文标题】使用 AsyncTask 中的 onPostExecute 方法列表项单击事件调用 Android 中的另一个活动【英文标题】:Call another activity in Android using onPostExecute method list item click event in AsyncTask 【发布时间】:2019-03-10 15:09:00 【问题描述】:

我正在开发一个为列表视图填充 SQLite 数据库表并使用简单数组适配器的项目。

我正在为此目的使用 Asyntask,但遇到以下问题:

    我想调用另一个活动传递一些我从setOnItemClickListener得到的值

我需要在 onPostExecute setOnItemClickListener 方法中归档这两件事。这是我的代码。

        package com.me.doctor.doctor_me;

        import android.app.Activity;
        import android.app.Application;
        import android.content.Context;
        import android.content.Intent;
        import android.database.Cursor;
        import android.database.sqlite.SQLiteDatabase;
        import android.os.AsyncTask;
        import android.view.View;
        import android.widget.AdapterView;
        import android.widget.ListView;
        import android.widget.Toast;

        public class BackgroundTask extends AsyncTask<String,Doctor,String> 

            Context ctx;
            DoctorAdapter doctorAdapter;
            Activity activity;
            ListView listView;
            Doctor doctor;
            DisplayDoctor displayDoctor;

            BackgroundTask(Context ctx)
                this.ctx = ctx;
                activity = (Activity) ctx;
                doctor = new Doctor();
                displayDoctor = new DisplayDoctor();
            
            @Override
            protected String doInBackground(String... strings) 

                String method = strings[0];
                DatabaseOperation databaseOperation = new DatabaseOperation(ctx);
                if(method.equals("get_info"))
                    listView = activity.findViewById(R.id.display_list_view);
                    SQLiteDatabase db = databaseOperation.getReadableDatabase();
                    Cursor cursor = databaseOperation.getInformation(db);
                    doctorAdapter = new DoctorAdapter(ctx,R.layout.display_doctor_row);

                    String name, category, hospital;
                    int id;

                    while(cursor.moveToNext())
                        id = cursor.getInt(cursor.getColumnIndex("d_id"));
                        name = cursor.getString(cursor.getColumnIndex("d_name"));
                        category = cursor.getString(cursor.getColumnIndex("d_category"));
                        hospital = cursor.getString(cursor.getColumnIndex("d_hospital"));
                        Doctor doctor = new Doctor(id,name,category,hospital);
                        publishProgress(doctor);
                    
                    return "get_info";
                
                return null;
            

            @Override
            protected void onProgressUpdate(Doctor... values) 
                // add each of doctor class object add method inside the adapter class
                doctorAdapter.add(values[0]);
            

            @Override
            protected void onPostExecute(String s) 
                if(s.equals("get_info"))
                    listView.setAdapter(doctorAdapter);

                    listView.setOnItemClickListener(new  android.widget.AdapterView.OnItemClickListener() 
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                                final int position, long id) 

                            Doctor doctor = (Doctor)parent.getItemAtPosition(position);
                            String ID = Integer.toString(doctor.getId());
                            Toast.makeText(ctx,ID,Toast.LENGTH_LONG).show();

                            // I need fire another activity and pass some values which i getting here

                        
                    );
                else
                    Toast.makeText(ctx,s,Toast.LENGTH_LONG).show();
                

            

        

这是调用 AsyncTask 类的类

            package com.me.doctor.doctor_me;

        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;

        public class DisplayDoctor extends AppCompatActivity 

            @Override
            protected void onCreate(Bundle savedInstanceState) 
                super.onCreate(savedInstanceState);
                setContentView(R.layout.display_doctor_layout);
                BackgroundTask backgroundTask = new BackgroundTask(this);
                backgroundTask.execute("get_info");
            

        

我调查了有关 Stack Overflow 的已关闭问题,但没有找到解决方案。

【问题讨论】:

为什么不能在Activity 中调用setOnItemClickListener 您的意思是 DisplayDoctor 活动?所以那个时候那个方法给了我我想要从这个列表视图中得到的信息? 是的,我的意思是DisplayDoctor class 就这么简单:java2s.com/Code/Android/UI/…,~20 行代码 基本上您使用了错误的适配器:如果您的数据模型是基于 sqlite 的,请使用 [Simple]CursorAdapter 【参考方案1】:

简短回答: 您已经在后台任务中有上下文 Context ctx;

使用这个 this 来调用下一个活动 ctx.startActivity(nextActivityIntent)

你可以像这样向意图添加值 Intent nextActivityIntent = new Intent(ctx,NextActivity.class); nextActivityIntent.putExtra("data", "some data");

使用异步任务,我猜您正在尝试在另一个线程上查询数据库 您可以将加载器用于相同的 加载器在单独的线程上运行

这是一个简单的游标加载器示例

示例取自github

公共类 ForecastFragment 扩展 Fragment 实现 LoaderManager.LoaderCallbacks

public static final int LOADER_ID = 0;
private ArrayAdapter<String> forecastAdapter;
private ForecastAdapter mForecastAdapter;

public ForecastFragment()  

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) 
    getLoaderManager().initLoader(LOADER_ID, null, this);
    super.onActivityCreated(savedInstanceState);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    return rootView;


@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) 
    //some database query


@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) 
    //some action


@Override
public void onLoaderReset(Loader<Cursor> loader) 


【讨论】:

我可以把这个 startActivity() 方法放在 setOnItemClickListener 方法中吗? @SahanPasinduNirmal 是的,你可以

以上是关于使用 AsyncTask 中的 onPostExecute 方法列表项单击事件调用 Android 中的另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

Android中的AsyncTask和接口回调使用详解

AsyncTask 在 Kotlin 中的使用

即使使用取消方法也无法取消 AsyncTask 中的 doInBackground 进程

在任何地方使用我的 AsyncTask 类中的变量

片段中的 Asynctask 未到达 onPostExecute

如何使用 AsyncTask 的 onPostExecute 方法更新 Android 中的变量