我正在编写一个Android应用程序,它连接到服务器以获取/发布一些xml数据。我目前有一个小类,使用静态方法,如post(字符串URI,字符串体)和get(),它们包装httpclient调用以创建http post请求并返回响应。我想知道我是否也应该在自己的线程中使用这些方法。目前,我需要执行异步任务来调用我的Helper.post(..)方法来连接并从服务器获取请求。为了避免在我的应用程序中有多个重复的异步任务来进行后置调用,是否更好地将异步内容合并到帮助程序类中?
答案 0 :(得分:1)
作为一般原则,最好将重复的代码包装起来,这样你就不会不断重新发明轮子了。因此,如果您可以轻松地包装线程,那么这样做是个好主意。
这并不总是很容易。 从网络中获取某些内容的方法定义了一旦收到数据就要完成。通常你只需要退货。但是如果你在方法中进行线程化,那么你必须将其推送到某个地方。这导致了许多额外的回调,你不会(根据我的经验)节省很多。
我建议你不要为静态方法设置线程并定义一堆抽象的AsyncTasks,而不是定义一堆为你做线程的静态方法。每个人都定义了自己的doInBackground,并且未定义onProgressUpdate和onPostExecute方法。通过这种方式,您可以获得两全其美的效果 - 尽可能多地重复使用(doInBackground
代码),但能够自定义收到数据后的位置。
示例强>
您的静态代码:
public class MyStaticClass {
public static String getFoo( String name ) {
// use the network to get a string;
return "hello " + name; // Use your immagination.
}
}
AsyncTask
定义为public
,以便可以轻松重复使用。
public class GetFooTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground( String... name ) {
return MyStaticClass.getFoo(name[0]);
}
}
现在使用它。您的静态库或公共异步任务无法知道您需要对结果字符串执行的操作。所以你告诉它如何处理结果:
public class MyActivity extends Activity {
@Override
protected void onCreate( Bundle savedInstanceState ) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_view);
// You've already defined how to get the data
// so using it requires only minimal code now.
GetFooTask titleTask = new GetFooTask() {
@Override
public void onPostExecute( String heading ) {
((TextView) findViewById(R.id.heading)).setText(heading);
}
};
titleTask.execute("John");
}
}
在此示例中,您可以在任意数量的活动中使用GetFooTask
,只需告诉它每次放置数据的位置。
如果您真的认为您永远不想在同一个线程上执行两个网络任务,那么您可以将静态代码和“抽象”AsyncTask
结合起来。但是,在我最终返回结果之前,我经常发现我想在网络中发送几个东西。如果我在网络静态代码中执行了线程,我最终会为一个请求触发10个线程...因此我一直在线程化静态代码。