我正在为 android 编写一个连接到服务器以获取/发布一些 xml 数据的应用程序。我目前有一个带有静态方法的小类,例如 post(string URI, string body) 和 get(),它们包装了 httpclient 调用以创建 http post 请求并返回响应。我想知道我是否也应该让这些方法在他们自己的线程中工作。目前,我需要执行一个异步任务来调用我的 Helper.post(..) 方法来连接到服务器并从服务器获取请求。将异步内容合并到帮助程序类中以避免在我的应用程序中执行多个重复的异步任务来进行后期调用是否更好?
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 个线程......因此我一直在线程化静态代码。