我应该在mainactivity扩展活动中使用asynctask类吗?

yjghlzjz  于 2021-07-12  发布在  Java
关注(0)|答案(4)|浏览(351)

我想知道 AsyncTask 在主要活动中使用( MainActivity.java )运行线程。
例如,在使用 AsyncTask 它们在扩展 Activity 而不是建立一个独立的 .java 为此提交文件 AsyncTask ( MyAsyncTask.java ) class .
但我注意到,当使用独立文件时,我无法运行 runOnUIThread ()因为它属于 Activity 类,那么如何在独立的 AsyncTask (myasynctask.java)它扩展了 AsyncTask 而不是 Activity .

eanckbw9

eanckbw91#

那完全没问题。我经常这样做,但这取决于你如何使用它。如果它可能被其他人使用 Activities 然后我给它自己的类或者一个共享的类。但如果它是为一个单一的目的,那么我会使它成为 MainActivity .
使其成为内部类的好处是它可以直接访问该类的成员变量。如果你把它作为一个单独的类,那么你只需要为它创建一个构造函数,如果你需要传入的话 params 例如 context 或其他变量。
我不知道你到底在做什么,但我不确定你需要什么 runOnUiThread() . 您可以在 AsyncTask 归档并接受 context 作为一个情妇和任何你需要的东西。然后你可以更新 UIonPostExecute() 例子

public class MyAsyncTask extends AsyncTask{

    private Context context; 

    public MyAsyncTask(Context context) {  // can take other params if needed
        this.context = context;
    }

    // Add your AsyncTask methods and logic
    //you can use your context variable in onPostExecute() to manipulate activity UI
}

那就把它叫进来 MainActivity ```
MyAsyncTask myTask = new MyAsyncTask(this); //can pass other variables as needed
myTask.execute();

vq8itlhq

vq8itlhq2#

一般来说,我们 AsyncTask 在同一个类中,以更清楚地表明它仅由同一活动使用。
如果你想要的话 AsyncTask 要被多个活动重用,只需创建一个独立的类并通过构造函数从活动传递参数
您可以在asynctask中创建接口,将asynctask的响应发送到下面的活动,并在需要时调用lister方法。我已经叫它了 onPostExecute() :

public class DeckDownloader extends AsyncTask<Void, Void, String> {

    OnDownloadUpdateListener listener;

    public interface OnDownloadUpdateListener {
         public void OnDownloadDeckFinish(String Response);     
    }

    public DeckDownloader(Context ctx, OnDownloadUpdateListener listener) {
         mContext = ctx;
         this.listener = listener;
    }

    @Override
    protected String doInBackground(Void... params) {
         String str = "downloading";
         //your async code goes here
         return str;
    }

     @Override
     protected void onPreExecute() {
          super.onPreExecute();
     }

     @Override
     protected void onPostExecute(String result) {
          if( listener != null ) {
                listener.OnDownloadDeckProgress(result);
          }
     }
}

在activity类中,您需要实现该侦听器并编写代码来更新该实现方法中的textview:

public class myActivity extends Activity{
          private DeckDownloader.OnDownloadUpdateListener downloadListener;
          TextView txtAsyncResponse;

          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              txtAsyncResponse = (TextView) findViewById(R.id.txtAsyncResponse);

            downloadListener = new DeckDownloader.OnDownloadUpdateListener() {
               @Override
               public void OnDownloadDeckFinish(String Response) {
                    txtAsyncResponse.setText(Response);
               }
            };
    }

您可以编写下面的代码,在需要时在活动中启动asynctask,如button click事件或else

DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
 mTask.execute();

这就是你想要的东西!

xkftehaa

xkftehaa3#

我相信在大多数教程中,他们选择的是最容易理解/阅读的,而不是实际上最好的。
使用一个内部类,您可以保持活动的变量可用,这会更简单。
一般来说,您应该尽可能多地封装异步任务,这样您就可以从代码中的任何其他点重用它们。

qni6mghb

qni6mghb4#

对。您可以创建 AsyncTask class 在你的 MainActivity.java .

public class CategoryListScreen extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new loadcategory().execute();
    }

    class loadcategory extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) { }
        protected void onPostExecute(Void param) { }
    } // AsyncTask over
}//main class over

相关问题