2014-06-05 82 views
0

在我的Nexus 4上運行的Android應用程序時,我得到的錯誤:Android的錯誤,不能實例化服務......接口不能被實例化

cannot instantiate service ... interface ... cannot be instantiated 

搜索上線不已,但無法找到一個解決方案,除了說明接口不能被實例化。但我不知道如何解決它。

我的應用程序只需要是一個可以由Muzei應用程序調用的服務(一種插件)。提前幫忙https://github.com/romannurik/muzei/tree/master/example-source-500px

感謝:

這個程序是基於Muzei的例子!

Config.java

public interface Config { 
    public static final String API_KEY = "xxx"; 
} 

ArtSource.java

import java.util.Random; 

import package.name.muzei.MuzeiService.Photo; 
import package.name.muzei.MuzeiService.PhotosResponse; 

import retrofit.ErrorHandler; 
import retrofit.RequestInterceptor; 
import retrofit.RestAdapter; 
import retrofit.RetrofitError; 
import android.content.Intent; 
import android.net.Uri; 
import android.text.TextUtils; 
import android.util.Log; 

import com.google.android.apps.muzei.api.Artwork; 
import com.google.android.apps.muzei.api.RemoteMuzeiArtSource; 

public class ArtSource extends RemoteMuzeiArtSource { 
    private static final String TAG = "App"; 
    private static final String SOURCE_NAME = "ArtSource"; 

    private static final int ROTATE_TIME_MILLIS = 3 * 60 * 60 * 1000; // rotate every 3 hours 

    public ArtSource() { 
     super(SOURCE_NAME); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     setUserCommands(BUILTIN_COMMAND_ID_NEXT_ARTWORK); 
    } 

    @Override 
    protected void onTryUpdate(int reason) throws RetryException { 
     String currentToken = getCurrentArtwork() != null ? getCurrentArtwork().getToken() : null; 

     @SuppressWarnings("deprecation") 
     RestAdapter restAdapter = new RestAdapter.Builder() 
     .setServer("http://url.com") 
     .setRequestInterceptor(new RequestInterceptor() { 
      public void intercept(RequestFacade request) { 
       request.addQueryParam("key", Config.API_KEY); 
      } 
     }) 
     .setErrorHandler(new ErrorHandler() { 
      public Throwable handleError(RetrofitError retrofitError) { 
       int statusCode = retrofitError.getResponse().getStatus(); 
       if (retrofitError.isNetworkError() 
         || 500 <= statusCode && statusCode < 600) { 
        return new RetryException(); 
       } 
       scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS); 
       return retrofitError; 
      } 
     }) 
     .build(); 

     MuzeiService service = restAdapter.create(MuzeiService.class); 
     PhotosResponse response = service.getPopularPhotos(); 

     if (response == null || response.photos == null) { 
      throw new RetryException(); 
     } 

     if (response.photos.size() == 0) { 
      Log.w(TAG, "No photos returned from API."); 
      scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS); 
      return; 
     } 

     Random random = new Random(); 
     Photo photo; 
     String token; 
     while (true) { 
      photo = response.photos.get(random.nextInt(response.photos.size())); 
      token = Integer.toString(photo.id); 
      if (response.photos.size() <= 1 || !TextUtils.equals(token, currentToken)) { 
       break; 
      } 
     } 

     publishArtwork(new Artwork.Builder() 
     .title(photo.name) 
     .byline(photo.user.fullname) 
     .imageUri(Uri.parse(photo.image_url)) 
     .token(token) 
     .viewIntent(new Intent(Intent.ACTION_VIEW, 
       Uri.parse(photo.image_url))) 
       .build()); 

     scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS); 
    } 
} 

MuzeiService.java

import java.util.List; 

import retrofit.http.GET; 

interface MuzeiService { 
    @GET("/xxx?xxx=xxx") 
    PhotosResponse getPopularPhotos(); 

    static class PhotosResponse { 
     List<Photo> photos; 
    } 

    static class Photo { 
     int id; 
     String image_url; 
     String folder; 
     String name; 
     User user; 
    } 

    static class User { 
     String fullname; 
    } 
} 

AndroidManifest.xml中

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="" 
    android:versionCode="62" 
    android:versionName="1.0.9" android:installLocation="internalOnly"> 

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="19" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <!-- Required by RemoteMuzeiArtSource --> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <application android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name"> 

     <service android:name=".MuzeiService" 
      android:label="@string/source_name" 
      android:description="@string/source_description" 
      android:icon="@drawable/ic_launcher"> 
      <intent-filter> 
       <action android:name="com.google.android.apps.muzei.api.MuzeiArtSource" /> 
      </intent-filter> 
      <meta-data android:name="color" android:value="#fa0" /> 
     </service> 

    </application> 

</manifest> 

的strings.xml

<resources> 
    <string name="app_name">App - Muzei extension</string> 
    <string name="source_name">App</string> 
    <string name="source_description">App description</string> 
</resources> 

包括圖書館

  • muzei-API-1.0.jar
  • muzei-API 1.0〜 javadoc.jar
  • 改裝的1.5.1.jar

logcat的錯誤

06-05 22:56:42.087: E/AndroidRuntime(21599): FATAL EXCEPTION: main 
06-05 22:56:42.087: E/AndroidRuntime(21599): Process: package.name, PID: 21599 
06-05 22:56:42.087: E/AndroidRuntime(21599): java.lang.RuntimeException: Unable to instantiate service package.name.muzei.MuzeiService: java.lang.InstantiationException: interface package.name.muzei.MuzeiService cannot be instantiated 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2556) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.app.ActivityThread.access$1800(ActivityThread.java:135) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.os.Handler.dispatchMessage(Handler.java:102) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.os.Looper.loop(Looper.java:136) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.app.ActivityThread.main(ActivityThread.java:5017) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at java.lang.reflect.Method.invoke(Native Method) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
06-05 22:56:42.087: E/AndroidRuntime(21599): Caused by: java.lang.InstantiationException: interface package.name.muzei.MuzeiService cannot be instantiated 
06-05 22:56:42.087: E/AndroidRuntime(21599): at java.lang.Class.newInstance(Class.java:1540) 
06-05 22:56:42.087: E/AndroidRuntime(21599): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2553) 
06-05 22:56:42.087: E/AndroidRuntime(21599): ... 8 more 

回答

0

歐凱,在AndroidManifest.xml文件中,我指出了錯誤的Java類。

它應該是:ArtSource.java

雖然這會產生另一個錯誤,但它是一個完全不同的一個。所以這個問題已經得到解答。

1

每當聲明ServiceAndroidManifest.xml - 你開始你的應用程序,它試圖實例中宣稱,服務類參數android:name

具體而言,它試圖這樣做:

new MuzeiService(...); 

由於MuzeiService是一個接口(而不是一個類),這將失敗。

延伸閱讀:http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

+0

謝謝,我會研究它,並檢查你的答案。 –