Java 为UI和后台任务编写代码的正确方法 如何正确管理android应用程序的代码?(用于任务/UI) 如何将用户界面与代码分离?(使用类或打包) 如何从后台线程/操作将项目添加到用户界面(正确方式)?例如,i 有桌面布局。如何正确地将行添加到该表布局? 为我的需要创建自定义对象(类),然后将项目添加到对象 然后在整个对象中循环并将项目添加到TableLayout? 是否将TableLayout作为参考传递 更好的方法是为数据收集创建单独的类或包? (连接到数据提供程序,获取数据,将其显示给用户)
我四处搜索,找到了一些做背景任务的方法。Java 为UI和后台任务编写代码的正确方法 如何正确管理android应用程序的代码?(用于任务/UI) 如何将用户界面与代码分离?(使用类或打包) 如何从后台线程/操作将项目添加到用户界面(正确方式)?例如,i 有桌面布局。如何正确地将行添加到该表布局? 为我的需要创建自定义对象(类),然后将项目添加到对象 然后在整个对象中循环并将项目添加到TableLayout? 是否将TableLayout作为参考传递 更好的方法是为数据收集创建单独的类或包? (连接到数据提供程序,获取数据,将其显示给用户),java,android,Java,Android,我四处搜索,找到了一些做背景任务的方法。 -首先是。是这样写的,AsyncTasks最好用于短操作(最多几秒钟)。 -我发现的第二个问题是。 -还有其他正确的方法来完成后台任务吗 Witch方法对于从WEB服务收集数据是正确的(可能有一些延迟和滞后)? 如果使用处理程序,那么如何将数据传递到UI线程?。在大多数情况下,我对第三个问题感兴趣 谢谢。设计Android应用程序的结构有很多方法。你的问题很笼统,所以我的回答也是 要构建项目,您可以使用MVC模式,该模式可以轻松地与Android一起使用
-首先是。是这样写的,
AsyncTasks最好用于短操作(最多几秒钟)。
-我发现的第二个问题是。
-还有其他正确的方法来完成后台任务吗 Witch方法对于从WEB服务收集数据是正确的(可能有一些延迟和滞后)? 如果使用
处理程序
,那么如何将数据传递到UI线程?。在大多数情况下,我对第三个问题感兴趣
谢谢。设计
Android
应用程序的结构有很多方法。你的问题很笼统,所以我的回答也是
要构建项目,您可以使用MVC
模式,该模式可以轻松地与Android
一起使用:
- 模型:主要保存数据,如列表、数组、字符串等
- 控制器:处理模型数据,运行逻辑
- 视图:用户界面,可以显示来自模型的数据和/或运行来自控制器的逻辑
- [软件包]视图:
- Activty1.java
- Activty2.java
- [套餐]型号:
- Activty1DataModel.java
- Activty2DataModel.java
- [软件包]控制器:
- Activty1Logic.java
- Activty2Logic.java
AsyncTask
在新的独立线程中运行操作。onPostExecute
方法在完成任务后执行,并在UI线程上运行,因此您可以从这里直接与视图交互
对于真正的长时间运行任务,您应该使用
当您想从另一个线程与UI交互时,必须在UI线程上显式运行操作,例如:
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
Log.d("UI thread", "I am the UI thread");
}
});
与UI交互的另一种方式是使用接口
/监听器
要从web服务收集数据,可以将http客户端与异步任务一起使用,但不能从UI线程运行网络操作(将导致异常)。这是一个例子
下次请在不同的帖子里问几个问题,而不是一个问题。1)。问题不清楚。如果您的意思是这样的,您可以为每个类使用自己的.java
文件
2) 。使用多个包
3) 。我认为从后台更新UI的最好方法是使用接口。下载图像的示例(使用HttpClient
):
公共类AsyncImageSetter扩展AsyncTask{
专用onImageLoaderListener侦听器;
私有字符串msg,服务器;
公共异步ImageSetter(onImageLoaderListener侦听器){
this.listener=listener;
}
/*onImageLoaded回调将在UI线程上调用*/
ImageLoaderListener上的公共接口{
void onImageLoaded(位图bmp,字符串响应);
}
@凌驾
受保护位图doInBackground(字符串…参数){
HttpParams hparams=新的BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(10000);
HttpConnectionParams.setSoTimeout(10000);
服务器=参数[0];
HttpGet=新的HttpGet(服务器);
试一试{
DefaultHttpClient客户端=新的DefaultHttpClient(hparams));
HttpResponse响应=null;
/**如果需要的话,设置cookies*/
CookieStore store=client.getCookieStore();
HttpContext ctx=新的BasicHttpContext();
store.addCookie(您的SavedCookie对象);
setAttribute(ClientContext.COOKIE_STORE,STORE);
response=client.execute(get);
msg=response.getStatusLine().toString();
HttpEntity responseEntity=response.getEntity();
BufferedHttpEntity httpEntity=null;
试一试{
httpEntity=新的缓冲httpEntity(responseEntity);
}捕获(IOE1异常){
e1.printStackTrace();
}
InputStream imageStream=null;
试一试{
imageStream=httpEntity.getContent();
}捕获(IOE异常){
e、 printStackTrace();
}
返回BitmapFactory.decodeStream(imageStream);
}捕获(例外情况除外){
例如printStackTrace();
//错误处理
返回null;
}
}
/*如果后端设置了一些预定义的消息,请使用此方法/*
/*在我的情况下,这将是“警告”*/
私有无效检查响应(HttpResponse响应){
Header[]headers=response.getAllHeaders();
最终字符串target=“Warning”;
用于(标题h:标题){
if(h.getName().equalsIgnoreCase(目标)){
msg=h.getValue();
}否则{
继续;
}
}
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
/*现在在UI线程上调用此回调*/
/*如果一切正常,您将得到一个图像和msg中的“HTTP200OK”*/
if(侦听器!=null){
onImageLoaded(结果,消息);
}
}
}
您需要传递一个新的onImageLoaderListener
public class AsyncImageSetter extends AsyncTask<String, Void, Bitmap> {
private onImageLoaderListener listener;
private String msg, server;
public AsyncImageSetter(onImageLoaderListener listener) {
this.listener = listener;
}
/* the onImageLoaded callback will be invoked on UI thread */
public interface onImageLoaderListener {
void onImageLoaded(Bitmap bmp, String response);
}
@Override
protected Bitmap doInBackground(String... params) {
HttpParams hparams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(10000);
HttpConnectionParams.setSoTimeout(10000);
server = params[0];
HttpGet get = new HttpGet(server);
try {
DefaultHttpClient client = new DefaultHttpClient(hparams));
HttpResponse response = null;
/** set cookies if you need it */
CookieStore store = client.getCookieStore();
HttpContext ctx = new BasicHttpContext();
store.addCookie(yourSavedCookieObject);
ctx.setAttribute(ClientContext.COOKIE_STORE, store);
response = client.execute(get);
msg = response.getStatusLine().toString();
HttpEntity responseEntity = response.getEntity();
BufferedHttpEntity httpEntity = null;
try {
httpEntity = new BufferedHttpEntity(responseEntity);
} catch (IOException e1) {
e1.printStackTrace();
}
InputStream imageStream = null;
try {
imageStream = httpEntity.getContent();
} catch (IOException e) {
e.printStackTrace();
}
return BitmapFactory.decodeStream(imageStream);
} catch (Exception ex) {
ex.printStackTrace();
//error handling
return null;
}
}
/* use this method if your backend sets some pre-defined messages. /*
/* In my case that would be "Warning */
private void checkResponse(HttpResponse response) {
Header[] headers = response.getAllHeaders();
final String target = "Warning";
for (Header h : headers) {
if (h.getName().equalsIgnoreCase(target)) {
msg = h.getValue();
} else {
continue;
}
}
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
/* now this callback is invoked on UI thread */
/* if everything went without errors, you'll get an image and "HTTP 200 OK" in msg */
if (listener != null) {
listener.onImageLoaded(result, msg);
}
}
}