2015-09-10 2 views
0

Я создаю прототип приложения для Android, который работает следующим образом:Дизайн сетевой утилиты в приложении для Android

Когда пользователи запускают приложение, они могут просматривать список заголовков статей. Когда они нажимают на одну из них, приложение переключается на другую активность, содержащую содержимое статьи и т. Д. Пользователи также могут публиковать статью, когда они находятся в списке заголовков статей.

Я пытаюсь создать класс утилиты, скажем ServerConnect.java, для обработки всех запросов и ответа REST. В начале класс имеет 3 общедоступных статических метода для отправки запросов различного назначения.

1. requestArticleList
2. requestArticleContent
3. userSendArticle (пользователь добавить новую статью)

Тогда я узнаю, что я просто не могу назвать ServerConnect.requestArticleList(), как Android запрещает поведение сети на UI потоке. Поэтому я меняю класс ServerConnect на класс extends AsyncTask. И положите requestArticleList() в doInBackground(), затем делайте такие вещи, как new ConnectServer().execute()

Ну, это дает мне то, что я, когда я приветствую приложение и запрашиваю список статей. Тем не менее, моя проблема заключается в том, что этот класс ConnectServer может выполнять requestArticleList, поскольку он жестко закодирован в doInBackground @Override protected String doInBackground(Location userLocation) { return requestArticleList(userLocation); })


Есть ли какие-либо способы, которыми я могу обрабатывать все эти методы 3 как открытый статический метод в одном классе утилиты?
Спасибо за ваше терпение за такую ​​длинную историю.

ответ

0

Я не думаю, что положить это в один класс - хорошая идея. Если вы боитесь, что какая-то функция будет повторяться в 3 разных классах, вы можете поместить ее в какой-то базовый класс, как показано ниже.

Создать абстрактный базовый класс с общими функциями

public abstract class ConnectionUtils<A,B,C> extends AsyncTask<A,B,C> { 
    // put common functions here 
} 

Затем создайте 3 отдельный класс для каждого запроса

public class RequestArticleList extends ConnectionUtils<Location, Void, String> { 
    @Override 
    protected String doInBackground(Location... userLocation) { 
     return requestArticleList(userLocation); 
    } 
} 

Если вы действительно хотите, чтобы все эти функциональные возможности в одном классе можно создать интерфейс обратного вызова

public interface Callback<ResultType> { 
    void onResult(ResultType result); 
} 

а затем в каждой функции создать новый Тема

public void requestArticleList(final Callback<MyResult> callback) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // your code 
      callback.onResult(result); 
     } 
    }).start(); 
} 

Минусом является то, что его требуют switching to main thread перед тем Ui обновления.

+0

В моей системе requestArticleList и requestArticleContent выполняют практически то же самое, за исключением того, что предыдущий отправляет местоположение пользователя, а второй отправляет идентификатор статьи. поэтому я не хочу создавать другой класс только для метода requestArticleContent. Какие-либо предложения? – Yao

+0

Вы не должны бояться создавать новый класс для каждой задачи. Меньший класс легче читать и поддерживать. Но если вы не убедили, используйте метод потока сверху. –

-1
import android.content.Context; 

import android.net.ConnectivityManager; 

import android.net.NetworkInfo; 

public class NetworkUtil { 

    public static int TYPE_WIFI = 1; 
    public static int TYPE_MOBILE = 2; 
    public static int TYPE_NOT_CONNECTED = 0; 


    public static int getConnectivityStatus(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     if (null != activeNetwork) { 
      if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) 
       return TYPE_WIFI; 

      if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) 
       return TYPE_MOBILE; 
     } 
     return TYPE_NOT_CONNECTED; 
    } 

    public static String getConnectivityStatusString(Context context) { 
     int conn = NetworkUtil.getConnectivityStatus(context); 
     String status = null; 
     if (conn == NetworkUtil.TYPE_WIFI) { 
      status = "true"; 
     } else if (conn == NetworkUtil.TYPE_MOBILE) { 
      status = "true"; 
     } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) { 
      status = "false"; 
     } 
     return status; 
    } 
} 
+0

Это будет очень полезно для других, если вы включите какое-то объяснение – Anptk

Смежные вопросы