Java 如何使我的代码(异步任务)更干净?
我需要为我的最后一年项目构建一个android应用程序(我是android开发新手)。有没有办法将代码最小化,或者将代码分成不同的类 我想让我的主要活动更短、更干净,以便进行维护,如果可以使用MVC体系结构对其进行编码,那就更好了。稍后将添加更多UI组件。 谢谢你的关注Java 如何使我的代码(异步任务)更干净?,java,android,android-asynctask,Java,Android,Android Asynctask,我需要为我的最后一年项目构建一个android应用程序(我是android开发新手)。有没有办法将代码最小化,或者将代码分成不同的类 我想让我的主要活动更短、更干净,以便进行维护,如果可以使用MVC体系结构对其进行编码,那就更好了。稍后将添加更多UI组件。 谢谢你的关注 public class MainActivity extends AppCompatActivity { Button find_button; EditText user_origin; EditTe
public class MainActivity extends AppCompatActivity {
Button find_button;
EditText user_origin;
EditText user_destination;
private TextView json_output;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
find_button = (Button)findViewById(R.id.find_button);
json_output = (TextView)findViewById(R.id.json_output);
user_origin = (EditText)findViewById(R.id.user_origin);
user_destination = (EditText)findViewById(R.id.user_destination);
find_button.setOnClickListener(new View.OnClickListener(){
String origin;
String new_origin;
String destination;
String new_user_destination;
@Override
public void onClick(View v){
origin = user_origin.getText().toString();
new_origin = origin.replaceAll(" ", "+");
destination = user_destination.getText().toString();
new_user_destination = destination.replaceAll(" ", "+");
String link = "https://maps.googleapis.com/maps/api/directions/json?origin=" + new_origin + "&destination=" + new_user_destination + "&mode=transit&key=AIzaSyD83XCiGtJyo6Ln8c7yyyrQwmFDFZB_oiU";
//json_output.setText(link);
new JSONTask().execute(link);
}
});
}
public class JSONTask extends AsyncTask<String,String,String> {
@Override
protected String doInBackground(String... params){
HttpURLConnection connection = null;
BufferedReader reader = null;
try{
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = "";
while((line = reader.readLine()) != null ){
buffer.append(line);
}
String final_json = buffer.toString();
return buffer.toString();
} catch (MalformedURLException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} finally {
if(connection != null) {
connection.disconnect();
}
try {
if(reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
json_output.setText("result:" +result);
}
}
}
public类MainActivity扩展了AppCompatActivity{
按钮查找按钮;
编辑文本用户源;
编辑文本用户\目的地;
私有文本视图json_输出;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
find_按钮=(按钮)findviewbyd(R.id.find_按钮);
json_输出=(TextView)findViewById(R.id.json_输出);
user\u origin=(EditText)findViewById(R.id.user\u origin);
user\u destination=(EditText)findViewById(R.id.user\u destination);
find_button.setOnClickListener(新视图.OnClickListener(){
弦源;
串新_原点;
字符串目的地;
字符串新用户目的地;
@凌驾
公共void onClick(视图v){
origin=user_origin.getText().toString();
new_origin=origin.replaceAll(“,”+”);
destination=user_destination.getText().toString();
new_user_destination=destination.replaceAll(“,”+”);
字符串链接=”https://maps.googleapis.com/maps/api/directions/json?origin=“+new_origin+”&destination=“+new_user_destination+”&mode=transit&key=AIzaSyD83XCiGtJyo6Ln8c7yyyrQwmFDFZB_oiU”;
//json_output.setText(link);
新建JSONTask().execute(link);
}
});
}
公共类JSONTask扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
HttpURLConnection=null;
BufferedReader reader=null;
试一试{
URL=新URL(参数[0]);
connection=(HttpURLConnection)url.openConnection();
connection.connect();
InputStream=connection.getInputStream();
reader=新的BufferedReader(新的InputStreamReader(流));
StringBuffer=新的StringBuffer();
字符串行=”;
而((line=reader.readLine())!=null){
buffer.append(行);
}
字符串final_json=buffer.toString();
返回buffer.toString();
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
if(连接!=null){
连接断开();
}
试一试{
if(读卡器!=null){
reader.close();
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
json_output.setText(“结果:+result”);
}
}
}
您可以将您的JSONTask
分离为一个简单类,并执行其任务,然后在此类中定义一个接口,以传递一些消息或其他类应处理的数据,并添加一个参数类型,该参数类型为构造函数的此接口,并将其保存为字段。如下所示:
public class JSONTask extends AsyncTask<String,String,String>{
private OnHandleResult mResult;
private String[] mParams;
public JSONTask(OnHandleResult onHandleResult,String... params){
this.mResult = onHandleResult;
this.mParams = params;
}
protected String doInBackground(String... params){
//params is empty,get params from this.mParams
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
//json_output.setText("result:" +result);
this.mResult.handleResult(result);
}
public static interface OnHandleResult{
void handleResult(final String result);
}
}
new JSONTask(this,link).execute();
并执行如下任务:
public class JSONTask extends AsyncTask<String,String,String>{
private OnHandleResult mResult;
private String[] mParams;
public JSONTask(OnHandleResult onHandleResult,String... params){
this.mResult = onHandleResult;
this.mParams = params;
}
protected String doInBackground(String... params){
//params is empty,get params from this.mParams
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
//json_output.setText("result:" +result);
this.mResult.handleResult(result);
}
public static interface OnHandleResult{
void handleResult(final String result);
}
}
new JSONTask(this,link).execute();
通常每个文件上一节课是一个很好的练习。 您可以使main活动更具可读性
public class MainActivity extends AppCompatActivity {
Button find_button;
EditText user_origin;
EditText user_destination;
private TextView json_output;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
find_button = (Button) findViewById(R.id.find_button);
json_output = (TextView) findViewById(R.id.json_output);
user_origin = (EditText) findViewById(R.id.user_origin);
user_destination = (EditText) findViewById(R.id.user_destination);
String link = build_link(user_origin, user_destination);
MyListener l = new MyListener(link);
find_button.setOnClickListener(l);
}
private String build_link(EditText user_origin, EditText user_destination) {
String origin = user_origin.getText().toString();
String new_origin = origin.replaceAll(" ", "+");
String destination = user_destination.getText().toString();
String new_user_destination = destination.replaceAll(" ", "+");
return "https://maps.googleapis.com/maps/api/directions/json?origin=" + new_origin + "&destination=" + new_user_destination + "&mode=transit&key=AIzaSyD83XCiGtJyo6Ln8c7yyyrQwmFDFZB_oiU";
}
通过隔离侦听器的实现:
public class MyListener implements View.OnClickListener {
String link;
public MyListener(String link) {
this.link = link;
}
@Override
public void onClick(View v) {
new JSONTask().execute(link);
}
我还可以为UI组件创建另一个类吗?您可以将构造函数参数从
onHandlerResult
更改为Activity
,然后只有Activity的子类可以处理数据,但您应该保证您的Activity实现了此接口。