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

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

Войти
Регистрация
Восстановить пароль
 
Shiman_Gleb
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51
#1

Ошибка при открытии новой activity - Программирование Android

06.12.2015, 14:04. Просмотров 351. Ответов 6
Метки нет (Все метки)

Здравствуйте, уважаемые программисты. У меня возник вопрос: пишу приложение под Android, которое , при нажатии на кнопку, получает от сервера три строки и присваивает их значения radioButton, находящимся в новой activity. Проблема в том, что до открытия новой activity происходит ошибка и работа программы прекращается. Думал, дело в сокете (особенно учитывая что без него всё работает), поскольку открываю соединение с сервером сразу после открытия activity, но при отладке я до этого места даже не дохожу. Фактически, при вызове любой функции, содержащей сокет, приложение закрывается. Можете подсказать, в чём ошибка?
Код первой activity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example.ibookpc.kanjiq;
 
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //Метод кнопки, которая должна открывать новую activity.
    public void onStartButtonClick(View view) {
        startActivity(new Intent(this, QuestingActivity.class));
    }
}
Код второй activity (которая должна открываться, но вместо этого выдаёт ошибку):
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
package com.example.ibookpc.kanjiq;
 
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.ArrayList;
 
public class QuestingActivity extends AppCompatActivity {
 
    boolean answered = false;
    boolean correct = false;
    ArrayList<String> words=new ArrayList<String>();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_questing);
        //На объявлении сокета я ставил точку остановки отладки, но до неё отладчик даже не доходил.
        Socket clientSocket;
        try {
            clientSocket = new Socket("localhost", 2015);
            BufferedReader in  = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            words.add(in.readLine());
            words.add(in.readLine());
            words.add(in.readLine());
        } catch(IOException e)
        {
 
        }
        RadioButton case1 = (RadioButton) findViewById(R.id.radioButton1);
        RadioButton case2 = (RadioButton) findViewById(R.id.radioButton2);
        RadioButton case3 = (RadioButton) findViewById(R.id.radioButton3);
        case1.setText(words.get(1));
        case2.setText(words.get(2));
        case3.setText(words.get(3));
    }
 
    public void onNextButtonClick(View view)
    {
        if (answered==true){
            startActivity(new Intent(this, QuestingActivity.class));
        }
        else {
            Button button = (Button) findViewById(R.id.button3);
            button.setText("Next");
            answered = true;
        }
    }
}
Код сервера:
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
package serverPackage;
 
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Random;
 
public class Server {
    static public ArrayList<String> words=new ArrayList<String>();
    
    public static void main(String[] args) throws IOException {
        ServerSocket servers=null;
        Socket fromClient=null;
        BufferedReader in = null;
        PrintWriter    out= null;
        File file = new File( "words.txt" );
        BufferedReader br = new BufferedReader (
            new InputStreamReader(
                new FileInputStream( file ), "UTF-8"
            )
        );
        String line = null;
        while ((line = br.readLine()) != null) {
            words.add(line);
        }
        br.close();
        
        servers=new ServerSocket(2015);
        fromClient=servers.accept();
            
        in  = new BufferedReader(new 
        InputStreamReader(fromClient.getInputStream()));
        out = new PrintWriter(fromClient.getOutputStream(),true);
        String input, output;
        Random rand=new Random();
        int firstWordIndex=rand.nextInt(words.size());
        int secondWordIndex=firstWordIndex;
        do
        {
            secondWordIndex=rand.nextInt(words.size());
        }
        while (secondWordIndex==firstWordIndex);
        int thirdWordIndex=firstWordIndex;
        do
        {
            thirdWordIndex=rand.nextInt(words.size());
        }
        while (thirdWordIndex==firstWordIndex || thirdWordIndex==secondWordIndex);      
        out.println(words.get(firstWordIndex));
        out.println(words.get(secondWordIndex));
        out.println(words.get(thirdWordIndex));     
        
        
        in.close();
        out.close();
        in.close();
        fromClient.close();
            servers.close();
                
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2015, 14:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при открытии новой activity (Программирование Android):

При открытии программы узнать данные, которые хранятся в второй форме Activity, не переходя на неё - Программирование Android
Как на Android Studio передать информацию? Нужны при открытии программы узнать данные которые хранятся в второй форме Activity, не переходя...

Ошибка при переходе на новое Activity - Программирование Android
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? При переходе на новое активити программа выдает ошибку и вылетает. Я...

Как открыть Activity по открытии ссылки? - Программирование Android
Допустим, у нас есть WebView, как открывать Activity при открытии определенной ссылки? Например, http://localhost/login/ - открываем...

Ошибка при конвертации класса Activity в Fragment (SherlockFragment) - Программирование Android
есть такой класс public class MainActivity extends Activity { LinkedList&lt;Product&gt; products = new LinkedList&lt;Product&gt;(); ...

Ошибка при открытии проекта - Программирование Android
Склонировал проект с гитхаба и при его открытии Android Studio выдает следующие ошибки :app:generateSignedDebugResources ...

Ошибка при открытии AlertDialog - Программирование Android
Добрый день уважаемые форумчане и знатоки Android помогите с проблемкой.... Вот класс CustomListAdapter: package...

6
YuraAAA
1576 / 1317 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
06.12.2015, 14:21 #2
Shiman_Gleb, ошибка, видимо, NetworkOnMainThreadException, соединение надо делать в новом потоке. Читайте о AsyncTask/Loader
0
Shiman_Gleb
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51
06.12.2015, 14:37  [ТС] #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
соединение надо делать в новом потоке.
Я тоже так думал, но ошибка не исчезла.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Thread firstThread=new Thread(new Runnable()
            {
                public void run() 
                {                                                                       
                    Socket clientSocket;
        try {
            clientSocket = new Socket("localhost", 2015);
            BufferedReader in  = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            words.add(in.readLine());
            words.add(in.readLine());
            words.add(in.readLine());
        } catch(IOException e)
        {
 
        }
        RadioButton case1 = (RadioButton) findViewById(R.id.radioButton1);
        RadioButton case2 = (RadioButton) findViewById(R.id.radioButton2);
        RadioButton case3 = (RadioButton) findViewById(R.id.radioButton3);
        case1.setText(words.get(1));
        case2.setText(words.get(2));
        case3.setText(words.get(3));
                }               
            });
Этот поток вызывается там, где должно было быть соединение с сервером методом run().
Или я что-то не так в делаю при создании потока?
0
YuraAAA
1576 / 1317 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
06.12.2015, 14:59 #4
Shiman_Gleb, ошибка, видимо, NetworkOnMainThreadException, соединение надо делать в новом потоке. Читайте о AsyncTask/Loader
Цитата Сообщение от Shiman_Gleb Посмотреть сообщение
RadioButton case1 = (RadioButton) findViewById(R.id.radioButton1);
* * * * RadioButton case2 = (RadioButton) findViewById(R.id.radioButton2);
* * * * RadioButton case3 = (RadioButton) findViewById(R.id.radioButton3);
* * * * case1.setText(words.get(1));
* * * * case2.setText(words.get(2));
* * * * case3.setText(words.get(3));
а вот это должно быть в MainThread
0
Shiman_Gleb
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51
06.12.2015, 18:53  [ТС] #5
Цитата Сообщение от YuraAAA Посмотреть сообщение
Читайте о AsyncTask/Loader
Исходя из того что я узнал, я так понимаю что AsyncTaskLoader асинхронно выполняет какую-то задачу. Только не пойму: это считается как отдельный поток, или в нём нужно будет создавать отдельный поток, который в нём же и запускать?

Добавлено через 2 часа 8 минут
С AsyncTaskLoader ничего не изменилось, разве что стало ещё запутаннее:
Код activity:
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
package com.example.ibookpc.kanjiq;
 
import android.content.Intent;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
 
import java.util.ArrayList;
 
public class QuestingActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<String> {
 
    boolean answered = false;
    boolean correct = false;
    ArrayList<String> words=new ArrayList<String>();
 
    public static final String LOG_TAG = "my_tag";
    private Bundle mBundle;
    public static final int LOADER_RANDOM_ID = 1;
    private Loader<String> mLoader;
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_questing);
 
        mBundle = new Bundle();
        mBundle.putString("word", "test");
        mLoader = getSupportLoaderManager().initLoader(LOADER_RANDOM_ID, mBundle, this);
 
 
    }
 
    public Loader<String> onCreateLoader(int id, Bundle args) {
        Loader<String> mLoader = null;
         mLoader = new WordLoader(this, args);
        return mLoader;
    }
 
    public void onLoadFinished(Loader<String> loader, String data) {
        RadioButton case1 = (RadioButton) findViewById(R.id.radioButton1);        
        case1.setText(data);
    }
 
    public void onLoaderReset(Loader<String> loader) {
 
    }
 
    public void startLoad(View v) {
        mLoader.onContentChanged();
    }
 
 
    public void onNextButtonClick(View view)
    {
        if (answered==true){
            startActivity(new Intent(this, QuestingActivity.class));
        }
        else {
            Button button = (Button) findViewById(R.id.button3);
            button.setText("Next");
            answered = true;
 
 
        }
    }
}
Код класса, наследующего AsyncTaskLoader:
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
package com.example.ibookpc.kanjiq;
 
 
import android.support.v4.content.AsyncTaskLoader;
import android.content.Context;
import android.os.Bundle;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.ArrayList;
 
/**
 * Created by ibookpc on 06.12.2015.
 */
public class WordLoader extends AsyncTaskLoader<String> {
    final ArrayList<String> words=new ArrayList<String>();
    public String finalWord="";
    public WordLoader(Context context, Bundle args) {
        super(context);
    }
 
    @Override
    public String loadInBackground() {
        finalWord="";
        Thread firstThread=new Thread(new Runnable()
        {
            public void run()
            {
                Socket clientSocket;
                try {
                    clientSocket = new Socket("localhost", 2015);
                    BufferedReader in  = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                    words.add(in.readLine());
                    words.add(in.readLine());
                    words.add(in.readLine());
                } catch(IOException e)
                {
 
                }
 
                finalWord+=words.get(0) + '=';
                finalWord+=words.get(1) + '=';
                finalWord+=words.get(2) + '=';
            }
        });
        firstThread.run();
        while(words.size()<2)
        {
 
        }
        return finalWord;
    }
 
    @Override
    public void forceLoad() {
        super.forceLoad();
    }
 
    @Override
    protected void onStartLoading() {
        super.onStartLoading();
        forceLoad();
    }
 
    @Override
    protected void onStopLoading() {
        super.onStopLoading();
    }
 
    @Override
    public void deliverResult(String data) {
        super.deliverResult(data);
    }
}
0
YuraAAA
1576 / 1317 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
06.12.2015, 19:50 #6
Shiman_Gleb, не надо создавать еще один поток. Doinbackground выполняется в новом потоке
0
Shiman_Gleb
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 51
06.12.2015, 21:11  [ТС] #7
Цитата Сообщение от YuraAAA Посмотреть сообщение
не надо создавать еще один поток
Но в таком случае выдаёт всё ту же ошибку (хотя и с ним до сих пор выдаёт).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2015, 21:11
Привет! Вот еще темы с ответами:

Приложение зависает, если свернуть и развернуть Activity или перейти на другую Activity - Программирование Android
У меня в параллельном потоке происходит куча apply() Решение использовать apply вместо commit было принято из-за скорости. Но...

Android - Передача данных с одного Activity на другое Activity - Программирование Android
Здравствуйте , возникла необходимость получения числовых (int и float ну или double) данных в одном Activity , а обработка и вывод...

Изменение layout-элементов одного activity из другого activity - Программирование Android
Здравствуйте! Я хочу изменить размер или цвет текста TextView в одном activity из второго activity, каким образом мне можно это...

Ошибка с методом в activity - Программирование Android
Почему-то не хочет переводить из одной системы счисления в другую. import android.app.Activity; import android.os.Bundle; ...


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

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

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