Nano Hash - криптовалюты, майнинг, программирование

Передача строкового значения из класса активности в класс без активности

Я новичок в Android, и я пытаюсь передать строку из TextView из MainActivity в класс Client.java без активности. Я на самом деле пытаюсь сделать это в MainActivity :

    Intent i = new Intent(MainActivity.this, Client.class);
    i.putExtra("STRING_I_NEED", String.valueOf(indr));

В клиенте:

Context context;
Intent intent = ((Activity) context).getIntent();
static Bundle getIp = getIntent.getExtra("STRING_I_NEED");
public static final Bundle SERVERIP = getIp; 

Но это говорит "

Не удается разрешить символ "getIntent" в строке
static Bundle getIp = getIntent.getExtra("STRING_I_NEED");

Код клиента:

public class Client {
private static String mIP= "";
private String serverMessage;
public static final String SERVERIP = mIP;
public static final int SERVERPORT = 4444;
private OnMessageReceived mMessageListener = null;
private boolean mRun = false;

PrintWriter out;
BufferedReader in;


public void setIp(String _IP) {
    mIP = _IP;
}
public Client(OnMessageReceived listener) {
    mMessageListener = listener;
}


public void sendMessage(String message){
    if (out != null && !out.checkError()) {
        out.println(message);
        out.flush();
    }
}

public void stopClient(){
    mRun = false;
}

public void run() {

    mRun = true;

    try {
        InetAddress serverAddr = InetAddress.getByName(String.valueOf(SERVERIP));

        Log.e("TCP Client", "C: Connecting...");

        Socket socket = new Socket(serverAddr, SERVERPORT);

        try {

            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

            Log.e("TCP Client", "C: Sent.");

            Log.e("TCP Client", "C: Done.");

            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (mRun) {
                serverMessage = in.readLine();

                if (serverMessage != null && mMessageListener != null) {
                    mMessageListener.messageReceived(serverMessage);
                }
                serverMessage = null;

            }

            Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");

        } catch (Exception e) {

            Log.e("TCP", "S: Error", e);

        } finally {

            socket.close();
        }

    } catch (Exception e) {

        Log.e("TCP", "C: Error", e);

    }

}


public interface OnMessageReceived {
    void messageReceived(String message);
}
}

А вот и MainActivity:

public class MainActivity extends AppCompatActivity {
Server server;
Client client;
public static String message,ippi;
public static TextView terminale,indr,msg;
TextView log;
DataBaseHandler myDB;
allert Allert;
SharedPreferences prefs;
String s1 = "GAB Tamagnini SRL © 2017 \n" +
            "Via Beniamino Disraeli, 17,\n" +
            "42124 Reggio Emilia \n" +
            "Telefono: 0522 / 38 32 22 \n" +
            "Fax: 0522 / 38 32 72 \n" +
            "Partita IVA, Codice Fiscale \n" +
            "Reg. Impr. di RE 00168780351 \n" +
            "Cap. soc. € 50.000,00 i.v. \n" +  "" +
            "REA n. RE-107440 \n" +
            "presso C.C.I.A.A. di Reggio Emilia";
ImageButton settings,helps,allerts,home;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Utils.darkenStatusBar(this, R.color.colorAccent);
    server = new Server(this);
    myDB = DataBaseHandler.getInstance(this);
    new connectTask().execute("");

    msg = (TextView) findViewById(R.id.msg);
    log = (TextView) findViewById(R.id.log_avviso);
    settings = (ImageButton) findViewById(R.id.impo);
    helps = (ImageButton) findViewById(R.id.aiut);
    allerts = (ImageButton) findViewById(R.id.msge);
    home = (ImageButton) findViewById(R.id.gab);
    terminale = (TextView) findViewById(R.id.terminal);
    indr = (TextView) findViewById(R.id.indr);

    Cursor cursor = myDB.fetchData();
    if(cursor.moveToFirst()){
        do {
            indr.setText(cursor.getString(1));
            terminale.setText(cursor.getString(2));
        }while(cursor.moveToNext());
    }


    client.setIp(indr.getText().toString());


    cursor.close();
    server.Parti();



    message = indr.getText().toString();

    if (client != null) {
        client.sendMessage(message);
    }

    home.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View view) {
                                    Toast.makeText(MainActivity.this,Client.SERVERIP, Toast.LENGTH_LONG).show();
                                }
                            });

    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent impostazioni = new Intent(getApplicationContext(), settingsLogin.class);
            startActivity(impostazioni);
        }
    });

    helps.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent pgHelp = new Intent(getApplicationContext(), help.class);
            startActivity(pgHelp);
        }
    });

    allerts.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Server.count = 0;
            SharedPreferences prefs = getSharedPreferences("MY_DATA", MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.clear();
            editor.apply();
            msg.setVisibility(View.INVISIBLE);
            Intent pgAlert = new Intent(getApplicationContext(), allert.class);
            startActivity(pgAlert);
        }
    });

}

public class connectTask extends AsyncTask<String,String,Client> {

    @Override
    protected Client doInBackground(String... message) {

        //we create a TCPClient object and
        client = new Client(new Client.OnMessageReceived() {
            @Override
            //here the messageReceived method is implemented
            public void messageReceived(String message) {
                //this method calls the onProgressUpdate
                publishProgress(message);
            }
        });
        client.run();

        return null;
    }

}
@Override
protected void onDestroy() {

    super.onDestroy();
    server.onDestroy();
}

}

  • почему бы не использовать метод для этого? 17.07.2017
  • Что такое Client.java ?? 17.07.2017
  • Попробуйте это намерение Intent = ((Activity) context).getIntent(); статический пакет getIp = намерение.getExtra(STRING_I_NEED); 17.07.2017
  • @IntelliJAmiya это класс TCP-клиента. 17.07.2017
  • @hareeshJ, если я это сделаю, getExtra говорит, что не может разрешить метод getExtra (java.lang.String) 17.07.2017
  • @ Иван, есть пример метода? 17.07.2017
  • @I.Mytyuk Ответил на примере 17.07.2017

Ответы:


1

Проблема:

Поскольку Client.java (по вашему мнению) не является классом типа Activity, вы не можете вызывать/вызывать Client.java с помощью класса Intent. Intent используется только для вызова: Activities, BroadcastReceiver и Services.

Ваш Client.java не расширяет Activity, Broadcast или Service. По этой причине у вас нет функции getIntent() или даже функций onCreate(), onReceive(),onStartCommand()oronHandleIntent()'`, если уж на то пошло.


Правильный способ:

1. Итак, вам нужно создать объект этого класса, как и любой другой объект, и вызвать его метод установки. Вы можете определить общедоступный метод в своем классе, чтобы установить значение IP:

YourClass {
   private String mIP;

   public void setIp(String _IP) {
       mIp = _IP;
    }
}

А в классе MainActivity вы можете просто вызвать этот метод после инициализации объекта:

MyClassObject.setIp("127.0.0.1");

2. Определите перегруженный конструктор и установите значение с его помощью.

3. Создайте public static String IP в MainActivity, присвойте ему значение, а затем в своем классе сделайте это, чтобы получить значение:

YourClass {
       private String mIP;

       public void getIp() {
           mIP = MainActivity.IP;
        }
    }
17.07.2017
  • на самом деле я сделал это в Main: client.setIp(indr.getText().toString()); потому что я должен установить в mIP текст из TextView, а не делать это вручную, но все же, когда я пытаюсь его визуализировать, это приводит к нулю 17.07.2017
  • Пожалуйста, отредактируйте свой вопрос и опубликуйте этот соответствующий код, чтобы я мог видеть, в чем проблема, в любом случае вы пытаетесь получить значение из EditText с помощью пользовательского ввода (это отличается от TextView) ?? 17.07.2017
  • На самом деле я устанавливаю текст в EditText в классе settings.java, но я передаю это значение в базу данных и извлекаю его в MainActivity после того, как я установил этот текст в TextView, и я пытаюсь передать этот текст в строке клиенту. java неактивный класс, я сейчас опубликую MainActivity и клиентский код, подождите некоторое время. 17.07.2017
  • Я думаю, что клиент не инициализирован в момент вызова этого client.setIp(indr.getText().toString()); так как вы делаете это в асинхронной задаче, которая является отдельным потоком 17.07.2017
  • Ошибок нет, просто когда я сейчас пытаюсь проверить, есть ли какое-либо значение в SERVERIP, тост, с помощью которого я проверяю, оказывается пустым, когда должен быть текст, полученный из TextView в MainActivity. 17.07.2017
  • Хм ... в любом случае, вы всегда можете использовать общий префикс, я объясню это в другом ответе. 17.07.2017
  • На самом деле я сохранил эти данные в своей базе данных SQlite, может быть, я могу получить эти данные и установить их, используя их вместо SharedPrefs? 17.07.2017
  • Курсор курсора = myDB.fetchData(); if(cursor.moveToFirst()){ do { indr.setText(cursor.getString(1));client.setIP(cursor.getString(1)); терминал.setText(cursor.getString(2)); } пока (курсор.moveToNext()); } 17.07.2017
  • Да просто сделай это ^^ 17.07.2017
  • Только если вы уверены, что клиент инициализирован до того, как вы вызовете в нем setIp() 17.07.2017
  • На самом деле извлечение данных из БД, когда я пытаюсь визуализировать данные из SERVERIP в тосте, который говорит TextView... 17.07.2017
  • Отлично, теперь это работа, я помещал пустой mIP в SERVERIP, поэтому мне пришлось инициализировать его в функции setIp, спасибо, ваши советы были очень полезны. 17.07.2017
  • Когда у меня будет 15 повторений, я сделаю апвоут :) 17.07.2017
  • Давайте продолжим это обсуждение в чате. 17.07.2017

  • 2

    В вашем классе Client.

    public void setString(String yourString){
        variableToStoreStringInClass = yourString;
    }
    

    И в вашей MainActivity, где вы хотите отправить строку клиенту.

    Client yourClient = new Client();
    yourClient.setString("Enter the string");
    

    Или вы можете использовать статический метод:

    В классе клиента:

    public static void setString(String yourString){
        variableToStoreStringInClass = yourString;
    }
    

    И в вашей MainActivity

    Client.setString("Enter the string");
    
    17.07.2017
  • Я пытаюсь это сделать, но как я могу установить в Client.setString() текст, который находится в TextView? я пытаюсь сделать client.setIp(indr.getText().toString()); но когда я визуализирую это в Toast, результат нулевой 17.07.2017
  • где ты показываешь тост? Где вы делаете indr.getText.toString ? 17.07.2017
  • я показываю Toast в MainActivity по щелчку, выполняя indr.getText.ToString в OnCreate. 17.07.2017
  • Но на самом деле мне не нужен этот тост, я сделал его только для теста, если я передал эту строку. 17.07.2017
  • в Oncreate у вас все еще нет текста в TextView, я думаю, поэтому, когда вы назначаете ip, вы назначаете пустую строку и передаете ее своему классу Client. Попробуйте сделать setIp внутри onClick 17.07.2017
  • То же самое, тост также пуст, если я делаю это onClick. 17.07.2017
  • попробуйте удалить final из SERVERIP 17.07.2017
  • Все еще пусто, и мне действительно нужно сделать это onCreate, чтобы TCP-клиент отправлял ip каждый раз, когда он запускается. 17.07.2017
  • если вы печатаете indr.getText().toString() в журнале, имеет ли он значение? или тоже пусто? Попробуйте передать и URL-адрес жестко закодирован как client.setIp (127.0.0.1) и посмотрите, работает ли 17.07.2017
  • Вероятно, что-то не так при назначении mIP, потому что также, если я жестко запрограммирую client.setIp(127.0.0.1) и назначу его в Client.class как String SERVERIP = mIP, это вернет пустое поле в тосте. 17.07.2017
  • Другое дело, что в вашем setIp вы указываете mIp, а не SERVERIP, или это ваш последний комментарий? 17.07.2017
  • Также, если я поставлю SERVERIP вместо mIp, результат все равно будет пустым. 17.07.2017
  • Вы уверены, что ваша асинхронная задача завершена? 17.07.2017
  • Я так думаю, но я не уверен. 17.07.2017

  • 3

    В вашем действии настроек, когда вы устанавливаете строку в этом TextView, также сохраняйте ее в общих настройках, например:

    SharedPreferences prefs = this.getSharedPreferences(
          "com.example.app", Context.MODE_PRIVATE);
    
    prefs.edit().putString("IP", IP_String).apply();
    

    И затем в основной деятельности:

    SharedPreferences prefs = this.getSharedPreferences(
          "com.example.app", Context.MODE_PRIVATE);
    
    String ip = prefs.getString("IP", "AnyDefaultValue");
    
    client.setIp(ip);
    
    17.07.2017

    4

    Инициализируйте статическую строку в MainActivity и назначьте этой строке текст textView.

    В Client.java вызов, подобный этому, MainActivity.IntializedString

    17.07.2017
  • если я пытаюсь передать это так, когда я пытаюсь проверить, были ли данные переданы с тостом, тост говорит, что он нулевой. 17.07.2017

  • 5

    Попробуйте следующий образец

    public class Client {
        Context context;
        Intent intent;
        String value = "";
    
        public Client(Activity activity) {
            context = activity;
            intent = ((Activity) context).getIntent();
            value = intent.getStringExtra("String_i_need");
        }
    }
    
    17.07.2017
  • На самом деле я установил другую строку в Client.java как SERVERIP = value; но когда я пытаюсь визуализировать это в Toast в MainActivity, результат пустой 17.07.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..