Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Xodock
98 / 0 / 1
Регистрация: 23.07.2012
Сообщений: 7
#1

NullPointerException в дополнительной активности - Программирование Android

11.09.2013, 01:19. Просмотров 827. Ответов 10
Метки нет (Все метки)

Доброй ночи. Постараюсь сразу изложить проблему.
Есть код, который через php-прослойку, по ссылке, получает данные из mysql БД, через json, возвращаемый сервером, и есть две активности: Главная(MainActivity) и вторая (LoginActivity). В главной код работает, во второй, при нажатии на кнопку, выбрасывает:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
09-10 20:59:17.581: E/AndroidRuntime(1620): FATAL EXCEPTION: main
09-10 20:59:17.581: E/AndroidRuntime(1620): java.lang.NullPointerException
09-10 20:59:17.581: E/AndroidRuntime(1620):     at com.walker.android_php_mysql.LoginActivity.ListDrwaer(LoginActivity.java:132)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at com.walker.android_php_mysql.LoginActivity$JsonReadTask.onPostExecute(LoginActivity.java:95)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at com.walker.android_php_mysql.LoginActivity$JsonReadTask.onPostExecute(LoginActivity.java:1)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at android.os.AsyncTask.finish(AsyncTask.java:631)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at android.os.Looper.loop(Looper.java:137)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at android.app.ActivityThread.main(ActivityThread.java:5039)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at java.lang.reflect.Method.invokeNative(Native Method)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at java.lang.reflect.Method.invoke(Method.java:511)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-10 20:59:17.581: E/AndroidRuntime(1620):     at dalvik.system.NativeStart.main(Native Method)
Прилагаю ссылку на архив с проектом, коды активностей и шаблонов. Работаю в Eclips'e.
Если нужно добавить еще инфы - добавлю.
В разработке под android новичок, с java знакомство тоже начал недавно. Пока не во всё въезжаю.
Вопрошаю о помощи, уважаемые форумчане.

Архив с проектом:
http://rghost.ru/48683375

Главная активность:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package com.walker.android_php_mysql;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
     private String jsonResult;
     private String url = "http://ao96.ru/android.php?column=password&table=android_users&username=walker";
     private ListView listView;
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      listView = (ListView) findViewById(R.id.listView1);
      //accessWebService();
     }
     
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
     }
 // Async Task to access the web
    private class JsonReadTask extends AsyncTask<String, Void, String> {
     @Override
     protected String doInBackground(String... params) {
      HttpClient httpclient = new DefaultHttpClient();
      HttpPost httppost = new HttpPost(params[0]);
      try {
       HttpResponse response = httpclient.execute(httppost);
       jsonResult = inputStreamToString(
         response.getEntity().getContent()).toString();
       
      }
    
      catch (ClientProtocolException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
      return jsonResult;
     }
    
     private StringBuilder inputStreamToString(InputStream is) {
      String rLine = "";
      StringBuilder answer = new StringBuilder();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    
      try {
       while ((rLine = rd.readLine()) != null) {
        answer.append(rLine);
       }
      }
    
      catch (IOException e) {
       // e.printStackTrace();
       Toast.makeText(getApplicationContext(),
         "Error..." + e.toString(), Toast.LENGTH_LONG).show();
      }
      return answer;
     }
    
     @Override
     protected void onPostExecute(String result) {
      ListDrwaer();
      Toast.makeText(getApplicationContext(),  result, Toast.LENGTH_LONG).show();
     }
    }// end async task
    
    public void accessWebService(String link) {
     JsonReadTask task = new JsonReadTask();
     // passes values for the urls string array
     task.execute(new String[] { link });
     //Toast.makeText(getApplicationContext(),  jsonResult, Toast.LENGTH_LONG).show();
    }
    
    // build hash set for list view
    public void ListDrwaer() {
     List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>();
    
     try {
         
      JSONObject jsonResponse = new JSONObject(jsonResult);
      JSONArray jsonMainNode = jsonResponse.optJSONArray("emp_info");
 
      for (int i = 0; i < jsonMainNode.length(); i++) {
       JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
       String name = jsonChildNode.optString("password");
       //String number = jsonChildNode.optString("employee no");
       String outPut = name;// + "-" + number;
       employeeList.add(createEmployee("employees", outPut));
      }
     } catch (JSONException e) {
      Toast.makeText(getApplicationContext(), "Error" + e.toString(),
        Toast.LENGTH_SHORT).show();
      
     }
    
     SimpleAdapter simpleAdapter = new SimpleAdapter(this, employeeList,
       android.R.layout.simple_list_item_1,
       new String[] { "employees" }, new int[] { android.R.id.text1 });
     listView.setAdapter(simpleAdapter);
    }
    
    private HashMap<String, String> createEmployee(String name, String number) {
     HashMap<String, String> employeeNameNo = new HashMap<String, String>();
     employeeNameNo.put(name, number);
     //Toast.makeText(getApplicationContext(),  jsonResult, Toast.LENGTH_LONG).show();
     return employeeNameNo;
    }
    public void toLogin(View v)
    {
        //Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        //startActivity(intent);
        accessWebService(url);
    }
    public void toLogin1(View v)
    {
        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        startActivity(intent);
        //accessWebService(url);
    }
   }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<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"
    android:onClick="toLogin1"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:layout_alignParentTop="true" >
 
    </ListView>
 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/listView1"
        android:layout_marginRight="23dp"
        android:onClick="toLogin"
        android:text="@string/logon" />
 
    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/button1"
        android:layout_marginTop="45dp"
        android:ems="10" >
 
        <requestFocus />
    </EditText>
 
    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/editText1"
        android:ems="10"
        android:inputType="textPassword" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/editText2"
        android:layout_marginTop="58dp"
        android:onClick="toLogin1"
        android:text="Button" />
 
</RelativeLayout>
Вторая активность:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package com.walker.android_php_mysql;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
 
public class LoginActivity extends Activity {
    private EditText username;
    private EditText password;
     private String jsonResult;
     private String url = "http://ao96.ru/android.php?column=password&table=android_users&username=walker";
     private ListView listView;
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.logon);
      listView = (ListView) findViewById(R.id.listView1);
      //accessWebService();
     }
     
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
     }
 // Async Task to access the web
    private class JsonReadTask extends AsyncTask<String, Void, String> {
     @Override
     protected String doInBackground(String... params) {
      HttpClient httpclient = new DefaultHttpClient();
      HttpPost httppost = new HttpPost(params[0]);
      try {
       HttpResponse response = httpclient.execute(httppost);
       jsonResult = inputStreamToString(
         response.getEntity().getContent()).toString();
       
      }
    
      catch (ClientProtocolException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
      return jsonResult;
     }
    
     private StringBuilder inputStreamToString(InputStream is) {
      String rLine = "";
      StringBuilder answer = new StringBuilder();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    
      try {
       while ((rLine = rd.readLine()) != null) {
        answer.append(rLine);
       }
      }
    
      catch (IOException e) {
       // e.printStackTrace();
       Toast.makeText(getApplicationContext(),
         "Error..." + e.toString(), Toast.LENGTH_LONG).show();
      }
      return answer;
     }
    
     @Override
     protected void onPostExecute(String result) {
      ListDrwaer();
      Toast.makeText(getApplicationContext(),  result, Toast.LENGTH_LONG).show();
     }
    }// end async task
    
    public void accessWebService(String link) {
     JsonReadTask task = new JsonReadTask();
     // passes values for the urls string array
     task.execute(new String[] { link });
     //Toast.makeText(getApplicationContext(),  jsonResult, Toast.LENGTH_LONG).show();
    }
    
    // build hash set for list view
    public void ListDrwaer() {
     List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>();
    
     try {
         
      JSONObject jsonResponse = new JSONObject(jsonResult);
      JSONArray jsonMainNode = jsonResponse.optJSONArray("emp_info");
 
      for (int i = 0; i < jsonMainNode.length(); i++) {
       JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
       String name = jsonChildNode.optString("password");
       //String number = jsonChildNode.optString("employee no");
       String outPut = name;// + "-" + number;
       employeeList.add(createEmployee("employees", outPut));
      }
     } catch (JSONException e) {
      Toast.makeText(getApplicationContext(), "Error" + e.toString(),
        Toast.LENGTH_SHORT).show();
      
     }
    
     SimpleAdapter simpleAdapter = new SimpleAdapter(this, employeeList,
       android.R.layout.simple_list_item_1,
       new String[] { "employees" }, new int[] { android.R.id.text1 });
     listView.setAdapter(simpleAdapter);
    }
    
    private HashMap<String, String> createEmployee(String name, String number) {
     HashMap<String, String> employeeNameNo = new HashMap<String, String>();
     employeeNameNo.put(name, number);
     //Toast.makeText(getApplicationContext(),  jsonResult, Toast.LENGTH_LONG).show();
     return employeeNameNo;
    }
    public void toLogin(View v)
    {
        //Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        //startActivity(intent);
        username = (EditText) findViewById(R.id.editText1);
        password = (EditText) findViewById(R.id.editText2);
        String link = "http://ao96.ru/android.php?column=password&table=android_users&username="+username.getText().toString();
        accessWebService(link);
    }
   }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:onClick="toLogin" >
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
 
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" >
 
            <requestFocus />
        </EditText>
 
        <EditText
            android:id="@+id/editText2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPassword" />
 
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="toLogin"
            android:text="@string/play_button" />
 
    </LinearLayout>
    
 
</ScrollView>
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 01:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос NullPointerException в дополнительной активности (Программирование Android):

Изменение настроек приложения из активности в рамках активности - Программирование Android
Друзья, помогите разобраться! имею наработки приложения-рисовалки, там есть у меня там активити (mainactivity) настроек, оттуда...

NullPointerException - Программирование Android
В методе присутствует вот такая конструкция new Thread(new Runnable() { @Override public void run() { ...

NullPointerException - Программирование Android
Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override ...

NullPointerException - Программирование Android
Не пойму почему налл?? @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, ...

NullPointerException - Программирование Android
Здравствуйте! На строке AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1); выдает...

NullPointerException - Программирование Android
Помогите разобраться в логе. Не могу понять где вылазит NullPointerException. 08-12 08:40:49.847: E/AndroidRuntime(858): FATAL...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
11.09.2013, 07:16 #2
1 почему то не могу найти где же у вас пресловутая кнопка которая роняет (во всяком случае в выложенном коде)
2 как вариант в jsonResult ноль потому что мы не смогли его получить предыдущим вызовом. посмотреть в пошаговой отладке где падает и что там в момент падения
Xodock
98 / 0 / 1
Регистрация: 23.07.2012
Сообщений: 7
11.09.2013, 19:32  [ТС] #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
XML
1
2
3
4
5
6
<Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="toLogin"
            android:text="@string/play_button" />
В logon.xml
Исполняемый метод "toLogin", соответственно, в LoginActivity.java
Спасибо за совет, сейчас попробую.

Добавлено через 9 минут
Чтобы в программе туда попасть, нужно в главной активности нажать на
XML
1
2
3
4
5
6
7
8
9
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/editText2"
        android:layout_marginTop="58dp"
        android:onClick="toLogin1"
        android:text="Button" />
Тогда нас перекинет во вторую активность, и станет доступна крашащая кнопка.

Добавлено через 1 час 25 минут
Проблема решена.
Java
1
listView = (ListView) findViewById(R.id.listView1);
А списочка-то на втором лэйауте и нету.
И, в итоге, тут всё и заканчивалось:
Java
1
listView.setAdapter(simpleAdapter);
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
11.09.2013, 19:42 #4
а вы пробовали во время обработки повернуть экран)?
Xodock
98 / 0 / 1
Регистрация: 23.07.2012
Сообщений: 7
11.09.2013, 20:27  [ТС] #5
Не совсем понимаю, зачем? Там же ничего к положению экрана не привязано. И отлаживаю я на эмуляторе, не знаю, можно ли эмулировать наклоны?
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
11.09.2013, 20:43 #6
можно. какой то из функциональных клавиш. да, ничего не привязано. кроме того что у вас по завершению обработки идет обращение к элементу формы, а форма при повороте пересоздается)
Xodock
98 / 0 / 1
Регистрация: 23.07.2012
Сообщений: 7
11.09.2013, 22:38  [ТС] #7
Но на logon.xml всё равно нет элемента, с id "listView1", форма бы пересоздалась, но как это помогло бы? Не понимаю(
verylazy
Заблокирован
11.09.2013, 22:49 #8
по идее ругается на 95-ю строку LoginActivity
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show()

я бы перед ней написал
Java
1
System.out.println(getApplicationContext() + " " + result);
Xodock
98 / 0 / 1
Регистрация: 23.07.2012
Сообщений: 7
12.09.2013, 00:21  [ТС] #9
Нет, это была 132 строка этого файла. Вот:
Проблема решена.
Java
1
listView = (ListView) findViewById(R.id.listView1);
А списочка-то на втором лэйауте и нету.
И, в итоге, тут всё и заканчивалось(строка 132):
Java
1
listView.setAdapter(simpleAdapter);
Всем спасибо за помощь.
vxg
Модератор
3155 / 1957 / 218
Регистрация: 13.01.2012
Сообщений: 7,484
12.09.2013, 07:22 #10
Цитата Сообщение от Xodock Посмотреть сообщение
Но на logon.xml всё равно нет элемента, с id "listView1", форма бы пересоздалась, но как это помогло бы? Не понимаю(
я с асинхронной задачей не работал, но идея такая: задача запускается и работает. экран поворачивают. все элементы экрана убиваются и создаются новые. задача заканчивает работать и модифицирует элемент экрана. если задача закончит работать до того как отработал onCreate (просто не знаю возможно ли это) она получит доступ к неинициализированному элементу экрана.
Xodock
98 / 0 / 1
Регистрация: 23.07.2012
Сообщений: 7
12.09.2013, 15:04  [ТС] #11
Буду иметь ввиду возможность такого развития событий, большое спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 15:04
Привет! Вот еще темы с ответами:

NullPointerException - Программирование Android
Доброго времени суток. Совсем недавно решил занятся разработкой под андроид, но вот на первых шагах столкнулся с проблемой. По аналогии...

Admob NullPointerException - Программирование Android
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Capture...

Proguard и NullPointerException - Программирование Android
Задействуйте! Надеюсь кто-то поможет. Проблема такая. В release версии ( с использованием proguard) приложения возникает ошибка ...

Unboxing of may produce NullPointerException - Программирование Android
Здравствуйте, сегодня столкнулся с незнанием, как поступить в данной ситуации. Сегодня не трогал ту часть кода, которая отвечает за данные,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.09.2013, 15:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru