2013-02-26 4 views
-2

Я делаю приложение sms, где пользователь вводит контакт и сообщение, а затем нажимает кнопку butenc. Кнопка должна отправить переменный номер телефона и сообщение в другой класс java, где метод получает данные и манипулирует им. Ecc java-файл является автономным java-классом, который связан с различными другими классами Java для операций над сообщением. Я иногда получаю ошибку stackoverflow, и когда я манипулирую несколькими вещами в коде, приложение запускается, и когда я нажимаю кнопку enc, ничего не происходит, но когда я нажимаю кнопку отправки, сообщение отправляется. Уверен, что у меня проблема с передачей переменной классу Ecc. Я обсуждал здесь различные вопросы по ОС, но ни один из них не решил проблему. Изменения, которые я делаю, дают одну из проблем, упомянутых выше. Как мне решить эту проблему?Невозможно вызвать методы класса java из класса активности

SMSTest.java (основной андроида активность)

package com.example.smsTest; 

import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Build; 
import android.os.Bundle; 
import android.telephony.SmsManager; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 


@TargetApi(Build.VERSION_CODES.DONUT) 
@SuppressLint("NewApi") 
public class SMSTest extends Activity 
{ 
    public final static String SMS_Message = "com.example.SMSTest.MESSAGE"; 
public final static String SMS_Phone = "com.example.SMSTest.MESSAGE"; 
Button btnSendSMS; 
Button btnEnc; 
EditText txtPhoneNo; 
EditText txtMessage; 

Еккл ЕСС;

/** Called when the activity is first created. */ 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   
    btnSendSMS = (Button) findViewById(R.id.btnSendSMS); 
    btnEnc = (Button) findViewById(R.id.btnEnc); 
    txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo); 
    txtMessage = (EditText) findViewById(R.id.txtMessage); 

    ecc=new Ecc(this); 

    /* 
    Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
    sendIntent.putExtra("sms_body", "Content of the SMS goes here..."); 
    sendIntent.setType("vnd.android-dir/mms-sms"); 
    startActivity(sendIntent); 
    */ 

    btnEnc.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     {    
      String phoneNo = txtPhoneNo.getText().toString(); 
      String message = txtMessage.getText().toString(); 
      if (phoneNo.length()>0 && message.length()>0){ 
       System.out.println("details verified"); 
       ecc.recv(phoneNo, message);  
       Toast.makeText(getBaseContext(), 
        "Ecc started", 
        Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    btnSendSMS.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     {    
      String phoneNo = txtPhoneNo.getText().toString(); 
      String message = txtMessage.getText().toString();    
      if (phoneNo.length()>0 && message.length()>0)     
       sendSMS(phoneNo, message); 
      else 
       Toast.makeText(getBaseContext(), 
        "Please enter both phone number and message.", 
        Toast.LENGTH_SHORT).show(); 
     } 
    });   
} 

//---sends a SMS message to another device--- 
@TargetApi(Build.VERSION_CODES.DONUT) 
@SuppressLint("NewApi")  
public void sendSMS(String phoneNumber, String message) 
{  
    /* 
    PendingIntent pi = PendingIntent.getActivity(this, 0, 
      new Intent(this, test.class), 0);     
     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber, null, message, pi, null);   
    */ 

    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(DELIVERED), 0); 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic  failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    //---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver(){ 
     @TargetApi(Build.VERSION_CODES.DONUT) 
     @SuppressLint("NewApi") 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
          break;     
      } 
     } 
    },new IntentFilter(DELIVERED));   

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);    
    } 
} 

Вот мой другой класс (Ecc.java)

package com.example.smsTest; 
import java.util.*; 
public class Ecc{ 

//code 
private SMSTest smsTest; 


// Constructor 
public Ecc(SMSTest smsTest) { 
    this.smsTest = smsTest; 
} 


public void recv(String phn, String smsg){ 

/*performs manipulation on phn and msg taken 
from the main activity using various other 
java files linked with it and again sends it 
back to themaina ctivities sendSMS method*/ 
smsTest.sendSMS(pnh,smsg) 
} 

//code 
} 

мой main.xml файл

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Enter the phone number of recipient" 
    />  
<EditText 
    android:id="@+id/txtPhoneNo" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"   
    /> 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"   
    android:text="Message" 
    />  
<EditText 
    android:id="@+id/txtMessage" 
    android:layout_width="fill_parent" 
    android:layout_height="150px" 
    android:gravity="top"   
    /> 

<Button 
    android:id="@+id/btnEnc" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Ecc" /> 

<Button 
    android:id="@+id/btnSendSMS" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Send SMS" 
    /> 

</LinearLayout> 

, когда я нажимаю кнопку сообщение отправлено отправить, но когда я нажимаю ЕСС начало нагрузки класса ecc ...

вот мой логарифм

02-26 13:04:36.337: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:36.447: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:36.447: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:36.797: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:36.797: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.077: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.117: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.247: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.247: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.318: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.391: I/Choreographer(1265): Skipped 74 frames! The application may be doing too much work on its main thread. 
02-26 13:04:37.416: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.416: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.427: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.427: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.437: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
02-26 13:04:37.447: W/Trace(1265): Unexpected value from nativeGetEnabledTags: 0 
+1

В чем проблема, когда вы получаете сообщение об ошибке, можете ли вы отправить сообщение об ошибке logcat? –

ответ

0

При создании экземпляра Ecc объекта, он создает SMSTest объекта, Тич создает Ecc объекта, который создает SMSTest объекта, до бесконечности. Это создает переполнение стека.

Это не может быть правильно.

Вам нужно что-то вроде этого в вашем Ecc классе:

// Reference to the SMSTest instance 
private SMSTest smsTest; 

// Constructor 
public Ecc(SMSTest smsTest) { 
    this.smsTest = smsTest; 
} 

В SMSTest, изменить

Ecc ecc=new Ecc(); 

в

Ecc ecc; // This variable gets initialized in onCreate() 

Тогда, в SMSTest.onCreate() сделать:

ecc=new Ecc(this); 
+0

ЧИТАЙТЕ, ЧТОБЫ БОЛЬШЕ, но у меня проблема с кнопкой. Я не получаю ошибку stackoverflow, но когда я нажимаю кнопку, он ничего не делает. – Rad

+0

Добавьте некоторые регистрации или задайте контрольные точки и посмотрите, вызван ли ваш метод 'onClick()'. –

+0

Я проверил, что метод вызывается, но класс ecc не загружается. Я отредактировал вопрос с обновленным кодом. – Rad

0

Добро пожаловать в StackoverFlow!

Ваш подход неправильный.

Деятельность никогда не создается таким образом. SMSTest smstest=new SMSTest();

Его лучшая передача ссылки на это действие при создании объекта Ecc, а затем использовать эту ссылку для вызова любого метода в вашей деятельности.

0

Создайте статический метод в классе java и вызовите его в действии с именем класса. И вы можете сделать наоборот.означает, что если вы хотите вызвать метод активности в классе java, тогда сделайте этот метод статическим в активности и вызовите этот метод по имени actvity.

+0

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

Смежные вопросы