@GET("/user")
Call<User> getUser(@Header("Authorization") String authorization)
public interface KotomatrixService {
@FormUrlEncoded
@POST("http://kotomatrix.ru")
Call<String> login(@Field("login") String login, @Field("password") String pass, @Field("act") String act, @Field("remember") String remember);
}
public class ApiFactory {
private static final int CONNECT_TIMEOUT = 15;
private static final int WRITE_TIMEOUT = 60;
private static final int TIMEOUT = 60;
private static final OkHttpClient CLIENT = new OkHttpClient();
static {
CLIENT.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
CLIENT.setWriteTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
CLIENT.setReadTimeout(TIMEOUT, TimeUnit.SECONDS);
}
@NonNull
public static KotomatrixService getKotomatrixService() {
return getRetrofit().create(KotomatrixService.class);
}
@NonNull
private static Retrofit getRetrofit() {
return new Retrofit.Builder()
.baseUrl("http://kotomatrix.ru")
.addConverter(String.class, new StringConverter())
.client(CLIENT)
.build();
}
}
public final class StringConverter implements Converter<String> {
@Override
public String fromBody(ResponseBody body) throws IOException {
return body.string();
}
@Override
public RequestBody toBody(String value) {
return RequestBody.create(MediaType.parse("text/plain"), value);
}
}
public class MainActivity extends AppCompatActivity implements Callback<String> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
KotomatrixService service = ApiFactory.getKotomatrixService();
Call<String> call = service.login("testUser", "testUser", "login", "true");
call.enqueue(MainActivity.this);
}
@Override
public void onResponse(Response<String> response) {
if (response.isSuccess()) {
// ищем куку и сохраняем
}
}
@Override
public void onFailure(Throwable t) {
}
}
UID|HASH|Version|Deleted
1|c4ca4238a0b923820dcc509a6f75849b|1|0
2|c81e728d9d4c2f636f067f89cc14862c|2|0
3|eccbc87e4b5ce2fe28308fd9f2a7baf3|4|0
4|a87ff679a2f3e71d9181a67b7542122c|8|1
5|e4da3b7fbbce2345d7772b0674a318d5|6|0
{
"version": 8,
"changed": [
{
"UID": 3,
"HASH": "eccbc87e4b5ce2fe28308fd9f2a7baf3"
},
{
"UID": 5,
"HASH": "e4da3b7fbbce2345d7772b0674a318d5"
}
],
"deleted": [
{
"UID": 4
}
]
}
Не надо бегать по спискам и сравнивать хэши.byte[] mls = new byte[11];
mls[0] = addCRC(new byte[]{1, 0x5, 11, 5 ,0, 0}); //10 сек
mls[1] = addCRC(new byte[]{1, 0x5, 11, 1 ,0, 0}); //0 сек
mls[2] = addCRC(new byte[]{1, 0x5, 0, 5 ,0, 0}); //30 сек
mls[3] = addCRC(new byte[]{1, 0x5, 1, 5 ,0, 0}); //5 сек
mls[4] = addCRC(new byte[]{1, 0x5, 2, 5 ,0, 0}); //5 сек
mls[5] = addCRC(new byte[]{1, 0x5, 3, 5 ,0, 0}); //5 сек
mls[6] = addCRC(new byte[]{1, 0x5, 4, 5 ,0, 0}); //5 сек
mls[7] = addCRC(new byte[]{1, 0x5, 5, 5 ,0, 0}); //5 сек
mls[8] = addCRC(new byte[]{1, 0x5, 6, 5 ,0, 0}); //5 сек
mls[9] = addCRC(new byte[]{1, 0x5, 7, 5 ,0, 0}); //5 сек
mls[10] = addCRC(new byte[]{1, 0x5, 8, 5 ,0, 0}); //5 сек
public int[] delays = new int[11]{10,0,30,5,5,5,5,5,5,5,5};
int shift;
public void onClickWrite(View v) {
int len = mls.length;
for (int i = 0; i < len; i++) {
shift += delays[i];
new Handler(Looper.getMainLooper()).postDelayed( new Runnable() {
public void run(){
byte b = mls[i];
mPhysicaloid.write(b, b.length);
}
}, shift);
}
}
URL url = new URL("http://backend.com/api.php");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
writeStream(out);
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
finally {
urlConnection.disconnect();
}
class Test {
public static void main(String[] args) {
int k = 10000;
long st, en;
int[] A;
int length = 100000;
A = new int[length];
st = System.nanoTime();
for (int i = 0; i < length; i++)
{
A[i] = k;
}
en = System.nanoTime();
System.out.println("\nOne time=" + (en - st) / 1000000.d + " msc");
int cache = 10000;
A = new int[length];
int[] temp = new int[cache];
st = System.nanoTime();
for (int N = 0; N < length; N+=cache) {
for (int i = 0; i < cache; i++) {
temp[i] = k;
}
System.arraycopy(temp, 0, A, N, temp.length);
}
en = System.nanoTime();
System.out.println("\nTwo time=" + (en - st) / 1000000.d + " msc");
}
}
Более удивительной по сравнению с производительностью при чтении является производительность при записи и копировании. Производительность при записи даже для рабочих наборов с небольшими размерами, никогда не поднимается выше 4 байтов за цикл. Это указывает на то, что в таких процессорах Netburst, Intel решила использовать в кэш-памяти L1d режим с прямой записью (Write-Through), при котором скорость, очевидно, ограничена скорость работы кэш-памяти L2. Это также означает, что производительность теста копирования, в котором данные копируются из одной области памяти в другую непересекающуюся области памяти, не намного хуже. Следовательно, требуемые операций чтения выполняются намного быстрее и могут частично перекрываться с операциями записи. Самым интересными деталями измерения записи и копирования является низкая производительность в случае, как только становится мало кэш-памяти L2. Производительность падает до 0,5 байта за цикл! Это значит, что операции записи в десять раз медленнее, чем операции чтения. Это означает, что оптимизация этих операций еще более важна для выполнения программы.
public class MyClass {
MyClassCallback callback;
public MyClass() {
if(callback != null)
callback.done();
}
public void setCallback(MyClassCallback callback) {
this.callback = callback;
}
public void perform() {
if(callback != null)
callback.done();
}
interface MyClassCallback {
void done();
}
}
public class MainActivity extends AppCompatActivity {
private MyClass myClass;
private MyClass.MyClassCallback myClassCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myClass = new MyClass();
myClassCallback = new MyClass.MyClassCallback() {
@Override
public void done() {
Toast.makeText(MainActivity.this, "Мое сообщение", Toast.LENGTH_LONG).show();
}
};
myClass.setCallback(myClassCallback);
myClass.perform();
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@color/item_color_test"
android:id="@+id/listView"/>
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
private final static String KEY = "selectedRow";
private MyAdapter adapter;
private int selectedItem = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
final String[] data = {
"a","v","c"
};
if(savedInstanceState != null && savedInstanceState.containsKey(KEY))
{
selectedItem = savedInstanceState.getInt(KEY);
}
adapter = new MyAdapter(this, R.layout.item, data, selectedItem);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String selected = data[position];
selectedItem = position;
adapter.setSelectedRow(selectedItem);
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY, selectedItem);
}
private class MyAdapter extends ArrayAdapter<String> {
final int resId;
int selectedRow;
public MyAdapter(Context context, int resId, String[] data, int selectedRow) {
super(context, resId, data);
this.resId = resId;
this.selectedRow = selectedRow;
selectedColor = getResources().getColor(R.color.item_color_test);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String string = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(resId, null);
}
TextView textView = (TextView) convertView;
textView.setText(string);
textView.setBackgroundColor(position == selectedRow ? selectedColor : 0x00000000);
return convertView;
}
public void setSelectedRow(int row)
{
selectedRow = row;
notifyDataSetInvalidated();
}
}
}
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:paddingLeft="10dp"/>
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyTask().execute();
}