2

サービス サンプル プログラムを実行しようとしたところ、次の例外が発生しました。

09-10 20:57:57.871: E/AndroidRuntime(280): 致命的な例外: メイン 09-10 20:57:57.871: E/AndroidRuntime(280): java.lang.RuntimeException: サービス com.example をインスタンス化できません。 demoservice.DownloadService: java.lang.InstantiationException: com.example.demoservice.DownloadService

文字列をコンストラクターに渡すなど、このタイプの実行に対する多くの解決策を見てきましたが、これらの解決策はこの問題を解決しませんでした。

コードサンプルを以下に示します

public class MainActivity extends Activity {

TextView     textView ;
private BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Bundle bundle = intent.getExtras();
        if(bundle != null){
            String filepath = bundle.getString(DownloadService.FILEPATH);
            int result = bundle.getInt(DownloadService.RESULT);
            if(result == Activity.RESULT_OK){
                Toast.makeText(context, "Sucess" + filepath, Toast.LENGTH_SHORT).show();
            }
            else{
                Toast.makeText(context, "Sucess", Toast.LENGTH_SHORT).show();

            }
        }

    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.status);
}

@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;
}
public void onClick(View v){
    Intent i = new Intent(this, DownloadService.class);
    i.putExtra(DownloadService.FILENAME, "index.html");
    i.putExtra(DownloadService.URL, "http://www.vogella.com/index.html");
    startService(i);
    textView.setText("Service started");
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    registerReceiver(receiver, new IntentFilter(DownloadService.NOTIFICATION));
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    unregisterReceiver(receiver);
}

}

サービスクラス

public class DownloadService extends IntentService{
  private int result = Activity.RESULT_CANCELED;
  public static final String URL = "urlpath";
  public static final String FILENAME = "filename";
  public static final String FILEPATH = "filepath";
  public static final String RESULT = "result";
  public static final String NOTIFICATION = "com.vogella.android.service.receiver";

public DownloadService(String name) {
    super("DownloadService");
    // TODO Auto-generated constructor stub
}

@Override
protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    String urlpath = intent.getStringExtra(URL);
    String filename = intent.getStringExtra(urlpath);
    File output = new File(Environment.getExternalStorageDirectory(), filename);
    if(output.exists()){
        output.delete();
    }
    InputStream input = null;
    FileOutputStream fout = null;

    try {
        java.net.URL url = new java.net.URL(urlpath);
        input = url.openConnection().getInputStream();
        InputStreamReader reader = new InputStreamReader(input);
        fout = new FileOutputStream(output.getPath());
        int next = -1;
        while((next = reader.read())!= -1){
            fout.write(next);
        }
        result = Activity.RESULT_OK;
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally{
        if(input != null){
            try {
                input.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(fout != null){
            try {
                fout.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    publishResult( output.getAbsoluteFile(), result);
}

private void publishResult(File absoluteFile, int result2) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(this,DownloadService.class);
    intent.putExtra(FILEPATH, absoluteFile);
    intent.putExtra(RESULT, result2);
    sendBroadcast(intent);

}

}

エミュレーターを使用してアプリを実行しています。外部ディレクトリに書き込みを行っているため、エミュレーターでこの問題を実行することは可能ですか?

誰でも私を助けることができますか?

4

1 に答える 1

1

使用する

public DownloadService() {
    super("DownloadService");
    // TODO Auto-generated constructor stub
}

それ以外の

public DownloadService(String name) {
    super("DownloadService");
    // TODO Auto-generated constructor stub
}

アップデート:

  1. 拡張するクラスのスーパー コンストラクターを呼び出す既定のコンストラクターを宣言する必要があります。すなわち。簡単に言えば、サービスに引数のないコンストラクターを提供する必要があります。これがないと、Android はサービスをインスタンス化できません。public IntentService (String name)IntentService

  2. startService(your_intent);ドキュメントに従って And を使用してインテントサービスを開始します

onStartCommand()IntentService のメソッドをオーバーライドしないでください。代わりに、IntentService が開始要求を受信したときにシステムが呼び出す onHandleIntent(Intent) をオーバーライドします。

インテントサービス

于 2013-09-10T15:39:06.063 に答える