1

ここで答えを見つけようとしていますが、尋ねられた質問のどれも役に立たないと感じています。

定期的なメンテナンスと変更が行われる Android アプリを開発しています。また、多くの休憩サービスを利用します。iOS では、接続を処理する接続クラスを作成することができました。受け取る必要があるのは、呼び出しているサービスの名前と、特定のサービスを呼び出すために必要な場合のパラメーターだけでした。すべての接続コードがこの 1 つのクラスにあるため、保守が非常に簡単でした。私はAndroidで同じことをしようとしましたが、スレッドのために本当に苦労しています(私はAsyncTaskを使用しています)。私は Android 開発に非常に慣れていないので、本当にばかげたことをしている場合や、これに役立つ Android オブジェクトを知らない場合は、ご容赦ください。

これは、「接続クラス」を呼び出す MainActivity のコードです。

public void submitLogin(View view){
    RestHandler rh=new RestHandler();
    rh.mainActivity=this;
    int connection = rh.checkConnection(this);
    if(connection!=0){
        /*GetServiceTask task = new GetServiceTask();
        task.execute(new String []{"http://httpbin.org/ip","http://httpbin.org/get"});*/
        rh.performServiceWithData(true, "http://httpbin.org/get");
    }else{
        new AlertDialog.Builder(this).setTitle(R.string.popup_info).setMessage(R.string.error_network).setNeutralButton(R.string.accept, null).show();
    }

}

public void success(String result){

    new AlertDialog.Builder(this).setTitle(R.string.popup_info).setMessage("success: " + result).setNeutralButton(R.string.accept, null).show();

}

そして、これが「接続クラス」のコードです

public class RestHandler{

private HttpClient client;
private HttpPost httPost;
private HttpGet httpGet;
private HttpResponse response;
private HttpEntity entity;
private InputStream inputStream;
private BufferedReader reader;
private StringBuilder stringBuilder;
private String line;
private String result;
private String finalResult="UNMODIFIED";
MainActivity mainActivity;

public String performServiceWithData(boolean isGet, String url){
    if(isGet){
        GetServiceTask task = new GetServiceTask();
        task.execute(new String[]{url});
    }else{
        PostServiceTask task = new PostServiceTask();
        task.execute(new String[]{url});
    }
    return finalResult;
}

private class GetServiceTask extends AsyncTask<String, Void, String>{
    protected String doInBackground(String... services) {
          String response = "";           
          for(String service:services){
              response=response + "\n" + sendGet(service);
          }

          return response;
        }
    protected void onPostExecute(String result) {
            finalResult = result;
            mainActivity.success(finalResult);
        }
}

private class PostServiceTask extends AsyncTask<String, Void, String>{
    protected String doInBackground(String... services) {
          String response = "";
          RestHandler rh=new RestHandler();
          for(String service:services){
              response=response + "\n" + sendPost(service, null);
          }

          return response;
        }
    protected void onPostExecute(String result) {
            finalResult = result;
        }
}

public String sendGet(String path) {

    try {
        client = new DefaultHttpClient();
        httpGet = new HttpGet(path);
        response = client.execute(httpGet);
        entity = response.getEntity();
        inputStream = entity.getContent();
        reader = new BufferedReader(new InputStreamReader(inputStream));
        stringBuilder = new StringBuilder();
        line = "";
        result = "";
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line + "\n");
        }
        result = stringBuilder.toString();
        inputStream.close();
        return result;
    } catch (Exception e) {
        result = e.toString();
        return null;
    }

}

public String sendPost(String path, List nameValuePairs) {
    try {
        client = new DefaultHttpClient();
        stringBuilder = new StringBuilder(path);
        httPost = new HttpPost(stringBuilder.toString());
        httPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        response = client.execute(httPost);
        entity = response.getEntity();
        inputStream = entity.getContent();
        reader = new BufferedReader(new InputStreamReader(inputStream));
        stringBuilder = new StringBuilder();
        line = "";
        result = "";
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line + "\n");
        }
        result = stringBuilder.toString();
        inputStream.close();
        return /*"sendPost correct " +*/ result;
    } catch (Exception e) {
        return "sendPost exception " + e.toString();
    }

}

public int checkConnection(Activity activity) {
    int connectionType=0;
    /* connectionType 0 --> no connection
     * connectionType 1 --> wifi
     * connectionType 2 --> cell network*/
    ConnectivityManager cm = (ConnectivityManager) activity
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] info = cm.getAllNetworkInfo();
    for (NetworkInfo ni : info) {
        if (ni.getTypeName().equalsIgnoreCase("wifi"))
            if (ni.isConnected())
                connectionType=1;
        if (ni.getTypeName().equalsIgnoreCase("mobile"))
            if (ni.isConnected())
                connectionType=2;
    }
    return connectionType;
}

}

このコードは機能しますが、アプリ内の任意のアクティビティで使用できるこれに似たものを作成したいと思います。これまでに開発したこの例は、MainActivity を接続クラスのオブジェクトとして使用しているためのみ機能します。

似ているがクラスから独立したものを作成する方法について何か提案はありますか? 「接続」クラスではなく、各アクティビティで asyncTask を実行する必要がありますか?

ところで、私の英語でごめんなさい:)

4

1 に答える 1

0

クラスを再利用するRestHandlerには、サービスを呼び出すすべてのアクティビティで単純なコールバック インターフェイスを実装します。

public interface IRestCallback
{
  void onSuccess(String result);
}

public class MainActivity extends FragmentActivity implements ICallback
{
  ...
  void onSuceess(String result)
  {
    // process result
  }
  public void submitLogin(View view)
  {
    RestHandler rh=new RestHandler();
    rh.mainActivity=this;
    ...
  }
}

public class RestHandler {
  ...
  IRestCallback mainActivity;
}
于 2013-07-24T09:38:25.287 に答える