我应该在MainActivity扩展Activity中使用AsyncTask类吗?

Ale*_*lex 12 android android-asynctask

我想知道是否AsyncTaskMainActivity.java运行该线程的main activity()中使用了它.

例如,我注意到许多教程在使用AsyncTask它们时在主类中声明了一个私有类,Activity而不是.java为那个AsyncTask(MyAsyncTask.java)创建一个独立的文件class.

但我注意到,使用一个独立的文件,当我不能够运行runOnUIThread(),因为它属于Activity类,所以我将如何能够使用独立的内部这种方法AsyncTask(MyAsyncTask.java)延伸AsyncTask,而不是Activity.

cod*_*gic 14

那完全没问题.我经常这样做,但这取决于你如何使用它.如果它可以被其他人使用,Activities那么我给它自己的类或共享类.但如果它只是为了一个目的,那么我会把它变成一个内在的类MainActivity.

使其成为内部类的好处是它可以直接访问该类成员变量.如果你把它作为一个单独的类,那么你需要为它创建一个构造函数,如果你需要传入params一个context或其他变量.

我不确切知道你在做什么,但我不确定你是否需要runOnUiThread().您可以在AsyncTask文件中创建构造函数,并将其context作为参数和您需要的任何其他内容接受.然后你可以更新UIinonPostExecute()

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
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 MainActivity

MyAsyncTask myTask = new MyAsyncTask(this);  //can pass other variables as needed
myTask.execute();
Run Code Online (Sandbox Code Playgroud)


Akb*_*ali 6

通常我们放在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);
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

在您的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);
               }
            };
    }
Run Code Online (Sandbox Code Playgroud)

您可以在下面编写代码,以便在需要时在您的活动中启动AsyncTask,如按钮点击事件或其他

 DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener);
 mTask.execute();
Run Code Online (Sandbox Code Playgroud)

这可能是你想要的thindg!