Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部类扩展Asynctask,外部类扩展Activity,然后从另一个Activity扩展外部类。这种做法不好吗?_Java_Android_Asynchronous - Fatal编程技术网

Java 内部类扩展Asynctask,外部类扩展Activity,然后从另一个Activity扩展外部类。这种做法不好吗?

Java 内部类扩展Asynctask,外部类扩展Activity,然后从另一个Activity扩展外部类。这种做法不好吗?,java,android,asynchronous,Java,Android,Asynchronous,这是坏习惯吗 import android.app.Activity; import android.os.AsyncTask; public abstract class Asynch extends Activity { public abstract void doInBackgroundAbstract(); public abstract void onPostExecuteAbstract(); protected class AsynchtaskSubCl

这是坏习惯吗

import android.app.Activity;
import android.os.AsyncTask;

public abstract class Asynch extends Activity {
    public abstract void doInBackgroundAbstract();
    public abstract void onPostExecuteAbstract();
    protected class AsynchtaskSubClass extends AsyncTask {
        @Override
        protected Object doInBackground(Object... arg0) {
            doInBackgroundAbstract();
            return null;

        }
        protected void onPostExecute(Object result){
            onPostExecuteAbstract();
        }
    }

}

public class SomeActivity extends Asynch {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_classes);
        new AsynchtaskSubClass().execute();
    }
            private Document doc;
        @Override
        public void doInBackgroundAbstract() {
            // NETWORK OPERATION GOES HERE!
            try {
                doc = Jsoup.connect("mySite").get();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        @Override
        public void onPostExecuteAbstract() {
            // Update UI Thread Here
            TextView myTextView = new TextView(SomeActivity.this);
            myTextView.setText(doc.select("a[href]").attr("abs:href").toString());
            setContentView(myTextView);

        }

我觉得这个干净多了。我不必继续创建内部异步任务,也不必创建单独的类来运行异步任务。如果我想拥有一个在许多活动中重用的Asynchtask,那么我只需扩展Asynch并重写抽象方法,并将其作为一个单独的类保留。他们这样做有什么不对吗?我看到的唯一问题是,如果我需要在一个活动中使用两个或多个异步任务。

正如您已经指出的,您的活动中不能有多个异步任务。除此之外,您的类只能扩展另一个类,不能扩展更多。 因此,如果您想要一个扩展ListActivity并具有异步任务的活动,则必须创建另一个抽象异步listActivityAsynch类,以此类推。
另一件事是,您的代码对于其他程序员来说,仅仅通过查看某些活动是不容易理解的。他们首先必须了解Asynch并理解您使用的不寻常的设计。如果您是唯一一个使用此代码的人,那么它可能很好。但是,如果其他人必须使用它,最好遵循android的常见做法,即在内部类中生成。

是的,正如您所指出的,如果您需要在一个活动中使用多个AsyncTask,则需要为每个AsyncTask分配一个id,以便在结果出来时处理。否则,我认为这种做法没有什么错,只是有点混乱。干杯最佳做法是什么?看起来我写android代码的方式很混乱,所以我试图找出一种更干净的方式。有没有清理异步任务的方法?据我所知,您最好使用线程,并通过其回调处理结果。AsyncTask在某些情况下我不确定,在作业完成后,线程仍然保留,直到系统调用gc,这可能会损害内存。当然,异步任务或线程都有其优点和缺点。选择适合你目的的东西。干杯我觉得你的方法很好很清楚。用户只需重写doInBackgroundAbstract和onPostExecuteAbstract方法并编写逻辑。无论如何,您已经提到了不能忽略的限制:。