2014-11-02 4 views
0

바인더 클래스를 사용하여 MainActivity에서 ServiceAdapter 클래스로 문자열을 전달하려고합니다. 응용 프로그램은 단순히 one이라는 EditText에 기록 된 내용을 가져 와서 그 문자열을 가져 와서 ServiceAdapter를 통해 전달합니다. ServiceAdapter는이 문자열을 가져 와서 텍스트 파일에 기록합니다. 내가 겪고있는 문제는 내가 단순히 메서드 안의 whats에 관계없이 ServiceAdapter 클래스의 메서드를 호출하면 치명적인 예외 오류가 발생한다는 것입니다. 나는 심지어 "안녕하세요 세상"을 인쇄하는 방법을 만들었고 충돌도 발생했습니다. 그래서 나는 여기서 무엇이 잘못되었는지를 확신하지 못한다. 감사합니다Android 바인딩 문자열을 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()); 

:

+0

감사합니다 (지금 어디에서 제거 그리고 물론,)

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()); } }; 

! 응용 프로그램이 더 이상 충돌하지 않지만 텍스트 파일을 전혀 만들지 않아 제대로 작동하는지 확실하지 않습니다. 파일을 만들 수있는 방법이 있습니까? 여기에 결함이있는 StringToFile() 메소드입니까? 아니면 다른 것입니까? – ssj3goku878

+1

일반적으로 Environment.getExternalDirectory() + "\ your_filename"을 사용하여 항상 경로를 지정합니다. Android에서했던 것처럼 파일을 만드는 동작이 무엇인지 모르겠습니다. 그것을 사용하면, 당신은 파일을 "메인 사용자 폴더"(일반적으로 sdcard라고 함)에 만들어야합니다. – JML

관련 문제