2013-09-23 26 views
2

我目前已经开发了一些应用程序,其中包含一些GUI和网络操作,但是我需要在没有GUI的情况下将其更多地变成一个库。带有UI的Android库

我知道在Properties/Android下有一个“is library”选项。但问题是:如何将项目中的GUI元素移出到不同的应用程序,以便库/项目只有Java代码;任何建议?

谢谢。

+0

听起来像你只是需要解耦两者。将库变成GUI调用的API –

+0

@ trevor-e因此,通常,库不包含GUI元素,只是一堆java代码。那么GUI应用程序只是通过简单的意图导入和调用库? (我对Android有点新鲜) – androidnoob

+0

它更简单。您可以导入该库,然后像使用代码那样使用这些类。除非该库与GUI相关,否则它将不包含GUI代码,否则它会使其不易重用。您应该使用该库来帮助填充您的GUI。我可以更具体地为你输入这个答案。 –

回答

1

如果您正在将代码编入库中,您希望尽可能从其他任何地方将其解耦。这使得它更便携,以便更多人可以使用图书馆的愿望。即使您现在只是为自己使用此库,稍后您可能希望将其发布给其他人。

例如,也许你的代码是这样的目前:

public void computeSum(int a, int b) { 
    int sum = a + b; 
    mTextView.setText(String.valueOf(sum)); 
} 

眼下这个代码是紧密结合mTextView。相反,它是有道理的改写这样的代码:

//In library 
public int computeSum(int a, int b) { 
    return a+b; 
} 

//Somewhere in your app 
mTextView.setText(String.valueOf(computeSum(3,4))); 

这是一个小的变化,但你可以看到,computeSum()不再加上mTextView。这使得整个项目甚至其他项目的使用都变得更加容易。现在,computeSum()方法是API的一部分。

因此,对于您的网络调用,尝试通过使用回调或返回值将它们与GUI的东西分离。

在问候你的最新评论:

您可以创建一个包装,像这样:

public class UIWrapper { 
    public Runnable runnable; 
    public SomeUiCallback callback; 
} 

然后在您的AsyncTask使用:

public class YourTask extends AsyncTask<UIWrapper, Void, Void> { 
    SomeUiCallback mCallback; 
    protected void doInBackground(UIWrapper... wrapper) { 
     mCallback = UiWrapper.callback; 
     UIWrapper.runnable.run(); 
    } 

    protected void onProgressUpdate() { 
    } 

    protected void onPostExecute() { 
     mCallback.runYourUiStuff(); 
    } 
} 

我写的编码很快,所以它可能不会编译,但希望你明白了。我认为这样的事情会起作用,并不确定它是否是最优雅的解决方案。您可以将Runnable替换为您想要在该线程中运行的任何内容。

所以UIWrapper和YourTask都会驻留在你的库中。您将创建UIWrapper,然后在YourTask中使用它。

+0

现在更有意义,但它是GUI部分(“mTextView.setText(String。的valueOf(computeSum(3,4))); “)仍然在库代码或单独的应用程序中导入图书馆? – androidnoob

+0

@ user2808163对不起,我将编辑该代码在您的应用程序库之外。 –

+0

真棒,谢谢。代表upvote的答案:) – androidnoob