2014-11-02 1 views
0

Я пытаюсь передать строку из моего MainActivity в мой класс ServiceAdapter, используя класс связующего. Приложение просто берет то, что было записано в EditText под названием one, и затем берет эту строку и передает ее через ServiceAdapter, который затем берет эту строку и записывает ее в текстовый файл. Проблема, которую я испытываю, заключается в том, что я получаю фатальную ошибку исключения, если я просто вызываю метод из класса ServiceAdapter независимо от того, что внутри метода. Я даже создал метод, который просто печатает «привет мир», а также сбой. Поэтому я не уверен, что здесь неправильно, любая помощь приветствуется. спасибоAndroid pass string в службу onbind вызывает сбой

// Основная деятельность

Button BtnStart, BtnStop; 
    EditText Edt; 
    TextView one; 
    ServiceAdapter mService; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     BtnStart = (Button)findViewById(R.id.button1); 
     BtnStop = (Button) findViewById(R.id.button2); 
     Edt = (EditText) findViewById(R.id.editText1); 
     one = (TextView) findViewById(R.id.textView1); 

    } 

    public String GetText() 
    { 
     String Text = this.Edt.getText().toString(); 
     return Text; 
    } 
    public void StartService(View v){ 
     //start Service 
     //startService(new Intent(getBaseContext(), ServiceAdapter.class)); 
     Intent i = new Intent(this,ServiceAdapter.class); 
     bindService(i, sc, Context.BIND_AUTO_CREATE); 
     Toast.makeText(getBaseContext(), "Service has been binded", Toast.LENGTH_LONG).show(); 
     this.mService.StringToFile(GetText()); 
     Toast.makeText(getBaseContext(), "Text Written", Toast.LENGTH_LONG).show(); 
    } 

    public void StopService(View v){ 
     //stop service 
     unbindService(sc); 
     Toast.makeText(getBaseContext(), "Service has been unbinded", Toast.LENGTH_LONG).show(); 



    } 

    private ServiceConnection sc = new ServiceConnection() 
    { 
     @Override 
     public void onServiceDisconnected(ComponentName name) 
     { 

     } 

     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) 
     { 
      LocalBinder binder = (LocalBinder) service; 
      mService = binder.getService(); 
     } 
    }; 

    @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; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 




} 

// serviceAdapter

package com.example.modulefour; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 
import android.widget.Toast; 

public class ServiceAdapter extends Service { 

    private final IBinder mBinder = new LocalBinder(); 
    MainActivity main; 
    FileWriter fw; 
    BufferedWriter bw; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return mBinder; 
    } 

    //create new class to call binder 
    public class LocalBinder extends Binder{ 
     public ServiceAdapter getService(){ 
      return ServiceAdapter.this; 
     } 
    } 
    public void StringToFile(String x){ 
     //write EditText to text file 
     String Text = x; 
     if(!Text.trim().equals("")) 
     { 
      File file = new File("TextFile.txt"); 

      //if file doesn't exist, then create it 
      if(!file.exists()) 
      { 
       try { 
        file.createNewFile(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      //write file 
      try { 
       fw = new FileWriter(file.getName(),true); 
       bw = new BufferedWriter(fw); 
       bw.write(Text); 
       bw.close(); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 




    } 


} 

ответ

1

Служба не запускается мгновенно, когда вы звоните

bindService(i, sc, Context.BIND_AUTO_CREATE); 

Вот почему этот кусок кода:

private ServiceConnection sc = new ServiceConnection() 
{ 
    @Override 
    public void onServiceDisconnected(ComponentName name) 
    { 

    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) 
    { 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
    } 
}; 

Как вы можете видеть, вы получаете ссылку на службу внутри onServiceConnected, и там вы можете безопасно называть методы mService. Попробуйте добавить:

this.mService.StringToFile(GetText()); 

есть:

private ServiceConnection sc = new ServiceConnection() 
{ 
    @Override 
    public void onServiceDisconnected(ComponentName name) 
    { 

    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) 
    { 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
     this.mService.StringToFile(GetText()); 
    } 
}; 

(И, конечно, удалить его, откуда он теперь)

+0

Спасибо! Однако приложение больше не разбивается, но он не создает текстовый файл, поэтому я не уверен, что он работает нормально. Есть ли способ убедиться, что файл создается? метод StringToFile() по ошибке здесь или это что-то еще? – ssj3goku878

+1

Обычно я всегда указываю путь, используя Environment.getExternalDirectory() + "\ your_filename", я не знаю, как это работает при создании файла, как в Android. Попробуйте использовать это, файл you'r должен быть создан в «основной папке пользователя», обычно называемой sdcard – JML

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